Problem polega na znalezieniu sposobu, który przerobi wektor dense (czyli z wartościami ze zbioru liczb rzeczywistych) na wektor binarny (tylko zera i jedynki), najlepiej w jakiś wyuczalny sposób. Bardziej formalnie jest to sposób na przejście z Euclidean Space do Hamming Space.

SUBIC zawiera zgrabne podsumowanie i porównanie kilku publikacji robiących supervised hashing: Z powyższej tabeli i samej treści publikacji wynika, że wszystkie wymienione metody trenują w dwóch krokach - najpierw sieć która przewiduje wektor dense, potem zamrażają tą sieć, zamieniają na binary poprzez sigmoid-threshold i ostatnią warstwę uczą na wektorach binarnych już.

Learning-based hashing dzieli się na (źródło: Deep Hashing for Compact Binary Codes Learning):

  1. unsupervised
    1. Mapowanie danych wejściowych na rozkład jednostajny nad przestrzenią sferyczną (tak robią w Spreading vectors for similarity search)
    2. LSH
  2. semi-supervised
  3. supervised
    1. DSH Główny pomysł do dodanie do lossa, który minimalizuje odległość elementy w wektorze dense do -1 lub +1, ale nie robią wcześniej sigmoida!
    2. Deep Hashing for Compact Binary Codes Learning Uwaga: bardziej teoretyczne podejście do prawie tego samego rozwiązania i modyfikacja maksymalizacji wariancji i maksymalizacji niezależności zaprezentowana w BDNN. Wektor binarny robią z wektora dense poprzez funkcję signum. Proponują loss składający się z kilku części:
      1. po prostu porównanie wektora binarnego z wektorem dense i minimalizacja różnicy
      2. maksymalizacja wariancji w wektorach binarnych
      3. maksymalizacja niezależności między poszczególnymi bitami
    3. SUBIC.
      1. Podstawowy pomysł to podzielenie wektora dense na bloki pewnej długości.
      2. Podczas treningu na każdy blok z osobna nakładany jest softmax; podczas testu każdy z bloków zamieniany jest na one-hot w taki sposób, że 1 pojawia się tam, gdzie wartość bloku po softmaxie (albo przed, to jest to samo) jest największa.
      3. Wymuszają, żeby wektor po softmaxie (czyli wektor dense) był jak najbliżej binarnemu poprzez dodanie do lossa entropii - minimalizując entropię chcemy, żeby wektor po softmaxie był bliski temu po one-hot, tzn. tylko w jednym miejscu miał 1

Pomysły

  1. żeby uniknąć problemów z brakiem gradientu można mieć dwie warstwy które przewidują wyjście, tzn. raz przewidywac p-stwo klika z warstwy dense, potem zrobić fikołek binaryzujący i drugi raz przewidywać o-stwo klika z takiego binarnego stworzenia. Tylko że to chyba też nie będzie uczyło się produkować dobrych wektorów do robienia thresholdu, no bo nie będzie można policzyć gradientu z binary do reszty sieci?##https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Liong_Deep_Hashing_for_2015_CVPR_paper.pdf
  2. można zastosować LSH zamiast zwykłych wyuczalnych thresholdów, będzie to na pewno elastyczniejsze tu pomysł jak to klepnąć: Implementing LSH Functions in Tensorflow
  3. sigmoid threshold może być wyuczalny! można go chyba osiągnąć poprzez przemnożenie przez warstwę liniową
  4. można zastosować Entropia binarna i porównać z obecnym rozwiązaniem
  5. przeczytać related work w https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Liong_Deep_Hashing_for_2015_CVPR_paper.pdf

Wyniki

hashesinnetest pc48h BSStest lc120h BSSval lc120h BSStrain lc120h BSSbest epochlink
--0.03330.01530.01770.02077(baseline)
128-0.02410.01010.01270.0144~80click
512-0.02640.01060.01430.018715click
2048-0.02790.01210.01580.021511click
2048kernel l2 = 1e-50.02700.01190.01500.021011click
2048kernel l1 = 1e-50.02840.01300.01550.20814click
2048kernel l1 = 1e-40.03060.01390.01630.020223click
2048kernel l1 = 1e-30.02930.01260.01560.016611click
2048kernel l1 = 1e-4, no bias0.03090.01390.01650.020222click
4096-0.02650.01320.01410.02338click
4096kernel l2 = 1e-50.02650.01280.01400.02107click
4096kernel l1 = 1e-4, no bias0.03040.01400.01640.01957click

Wyniki CTR

hashesinnetest BSSval BSStrain BSSlevel of binlink
--0.03570.03720.0432-(baseline)
4096-0.03250.03410.0421-click
8192-0.03250.03450.0440-click
-learnable bin, no extra loss0.0356 / 00.0368 / 00.0446 / 00.26 / 1click
-learnable bin, loss weight=0.10.0364 / 00.0374 / 00.0440 / 00.81 / 1click
-learnable bin, loss weight adaptive from 0.1 to 0.03605 / 00.82 / 1click
4096probit-click
4096probit, extra dense layer0.03090.03210.0390-click