Udostępnij za pośrednictwem


Czasy i transponuj godziny

CNTK produkt macierzy.

A * B
Times (A, B, outputRank=1)
TransposeTimes (A, B, outputRank=1)

Parametry

  • A pierwszy argument produktu macierzy. Może to być sekwencja czasowa.
  • B drugi argument produktu macierzy. Może to być sekwencja czasowa.
  • outputRank (wartość domyślna: 1): liczba osi A , które stanowią wymiar wyjściowy. Zobacz "Rozszerzona interpretacja dla tensorów" poniżej.

Wartość zwracana

Wynikowy produkt macierzy (tensor). Jest to sekwencja czasowa, jeśli dane wejściowe były sekwencją czasową.

Opis

Funkcja Times() implementuje produkt macierzy z rozszerzeniami dla tensorów. Operator * jest dla niego krótką ręką. TransposeTimes() transponuje pierwszy argument.

Jeśli A macierze i B są macierzami (tensor rank-2) lub wektorami kolumn (tensor rangi-1), A * B obliczą wspólny produkt macierzy, tak jak oczekiwano.

TransposeTimes (A, B) oblicza produkt A^T * Bmacierzy , w którym ^T określa transponsyję. TransposeTimes (A, B) ma taki sam wynik jak Transpose (A) * B, ale jest bardziej wydajny, ponieważ unika tymczasowej kopii transponowanej wersji programu A.

Sekwencje czasowe

Oba A i B mogą być pojedynczymi macierzami lub sekwencjami czasu. Typowym przypadkiem dla cyklicznych sieci jest A macierz wagi, podczas gdy B jest to sekwencja danych wejściowych.

Uwaga: Jeśli A jest sekwencją czasową, operacja nie jest wydajna, ponieważ uruchamia oddzielne wywołanie GEMM za każdym razem. Wyjątek polega na TransposeTimes() tym, że oba dane wejściowe są wektorami kolumn, dla których istnieje specjalna optymalizacja.

Obsługa rozrzedzeń

Times() i TransposeTimes() obsługują macierz rozrzednia. Wynik jest gęstą macierzą, chyba że oba są rozrzedne. Dwa najważniejsze przypadki użycia to:

  • B jest jedną gorącą reprezentacją wyrazu wejściowego (lub, częściej, całą sekwencję wektorów jedno-gorących). A * B Następnie oznacza osadzanie wyrazów, gdzie kolumny A są wektorami osadzania wyrazów. Poniżej przedstawiono zalecany sposób realizacji osadzania w CNTK:

    ```
    Embedding (x, dim) = Parameter (dim, 0/*inferred*/) * x
    e = Embedding (input, 300)
    ```
    
  • A jest jedną gorącą reprezentacją słowa etykiety. Popularne kryterium enttropii i licznik błędów można napisać odpowiednio przy użyciu TransposeTimes() następującego, gdzie z jest dane wejściowe klasyfikatora softmax() najwyższego poziomu i L sekwencja etykiet, które mogą być rozrzedliwe:

    ```
    CrossEntropyWithSoftmax (L, z) = ReduceLogSum (z) - TransposeTimes (L,          z)
    ErrorPrediction         (L, z) = BS.Constants.One - TransposeTimes (L, Hardmax (z))
    ```
    

Mnożenie za pomocą skalarnego

Nie można użyć produktu macierzy do pomnożenia macierzy z skalarnym. Zostanie wyświetlony błąd dotyczący niezgodności wymiarów. Aby pomnożyć za pomocą skalarnego, użyj zamiast tego produktu .* mądrego elementu. Na przykład średnia ważona dwóch macierzy może być napisana w następujący sposób:

z = Constant (alpha) .* x + Constant (1-alpha) .* y

Mnożenie za pomocą macierzy ukośnej

Jeśli macierz wejściowa ma przekątną i jest przechowywana jako wektor, nie należy używać Times() , ale mnożenie mnożenia elementów (ElementTimes() lub .* operatora). Na przykład

dMat = ParameterTensor {(100:1)}
z = dMat .* v

Wykorzystuje to semantyka rozgłaszania, aby pomnożyć każdy element z v odpowiednim wierszem .dMat

Rozszerzona interpretacja produktu macierzy dla tensorów rangi > 2

Jeśli A i/lub B są tensorami wyższej rangi, operacja określa uogólniony produkt macierzy, * gdzie wszystkie, ale pierwszy wymiar A musi być zgodny z wiodącymi wymiarami B, i są interpretowane przez spłaszczanie. Na przykład produkt [I x J x K] i [J x K x L] tensor (który skrót zostanie skrócony jako [I x J x K] * [J x K x L]) zostanie ponownie zinterpretowany przez przekształcenie dwóch tensorów jako macierzy jako [I x (J * K)] * [(J * K) x L], dla których produkt macierzy jest zdefiniowany i daje wynik wymiaru [I x L]. Ma to sens, jeśli uważa się, że wiersze macierzy wagi mają być wzorcami dopasowanymi do wektorów aktywacji. Powyższe uogólnienie pozwala na to, aby te wzorce były wielowymiarowe, takie jak obrazy lub uruchamianie okien funkcji mowy.

Istnieje również możliwość posiadania więcej niż jednego wymiaru niezgodnego w elemecie B. Na przykład [I x J] * [J x K x L] jest interpretowany jako ten produkt macierzy: [I x J] * [J x (K * L)] co daje wynik wymiarów [I x K x L]. Na przykład pozwala to zastosować macierz do wszystkich wektorów wewnątrz okna kroczącego L funkcji mowy wymiaru J.

Jeśli wynik produktu powinien mieć wiele wymiarów (takich jak rozmieszczanie aktywacji warstwy jako pole 2D), zamiast używać * operatora, należy powiedzieć Times (A, B, outputRank=m) , gdzie m jest liczba wymiarów, w których są rozmieszczone "wzorce" i które są przechowywane w danych wyjściowych. Na przykład Times (tensor of dim [I x J x K], tensor of dim [K x L], outputRank=2) będzie interpretowany jako produkt [(I * J) x K] * [K x L] macierzy i daje wynik wymiarów [I x J x L].