Dela via


Parametrar och konstanter

ParameterTensor{}

Skapar en skalär, vektor, matris eller tensor med lärbara parametrar.

ParameterTensor {shape,
                 init='uniform'/*|heNormal|...*/, initOutputRank=1, initValueScale=1.0,
                 randomSeed=-1,
                 initValue=0.0, initFromFilePath='',
                 learningRateMultiplier=1.0}

Parametrar

  • shape: form (dimensioner) av parametern som en matris. T.ex. (13:42) för att skapa en matris med 13 rader och 42 kolumner. För vissa åtgärder härleds dimensioner som anges som 0 automatiskt (se här)
  • init (standard "enhetlig"): anger slumpmässig initiering, t.ex. init='heNormal'(se här)
  • initOutputRank (standard 1): anger antalet inledande utrullningsaxlar. Om det är negativt -number efterföljande utspolningsaxlar (se här)
  • initValueScale (standard 1): ytterligare skalningsfaktor som tillämpas på slumpmässiga initieringsvärden
  • randomSeed (standard -1): om det är positivt använder du det här slumpmässiga fröet för slumpmässig initiering. Om det är negativt använder du en räknare som ökar för varje ParameterTensor{}
  • initValue: anger initiering med ett konstant värde, t.ex. initValue=0
  • initFromFilePath: anger initiering genom att läsa in inledande värden från en fil. T.ex. initFromFilePath="my_init_vals.txt"
  • learningRateMultiplier: Systeminlärningshastigheten skalas av detta (0 för att inaktivera inlärning) (se här)

Returvärde

En tensor av lärbara parametrar.

Beskrivning

Den här fabriksfunktionen skapar en skalär, vektor, matris eller tensor med lärbara parametrar, det vill:s en tensor som identifieras av åtgärden "train" som innehåller parametrar som ska uppdateras under träningen.

Värdena initieras, beroende på vilken valfri parameter som anges, för att

  • slumptal, om init anges;
  • en konstant om initValue anges. eller
  • en tensor-läsning från en extern indatafil om initFromFilePath anges. Standardvärdet är init="uniform".

Om du vill skapa en skalär, vektor, matris eller tensor med rangordning>2 skickar du följande som parametern shape:

  • (1) för en skalär;
  • (M) för en kolumnvektor med M element.
  • (1:N) för en radvektor med N element. Radvektorer är enradsmatriser;
  • (M:N) för en matris med N rader och I kolumner.
  • (I:J:K...) för en tensor av godtycklig rang>2 (obs! den högsta tillåtna rangordningen är 12); och
  • (W:H:C) för en tensor som matchar dimensionerna för en [W x H] bild med C kanaler.

Automatisk dimensionsinferens

När en ParameterTensor används för vikter som en omedelbar indata för specifika åtgärder, kan du ange vissa dimensioner som Inferred. Till exempel kommer den matrisproduktenParameterTensor{42:Inferred} * x) automatiskt att dra slutsatsen att den andra dimensionen är lika med dimensionen för x.

Detta är mycket praktiskt för indata från lager, eftersom det frigör användarens BrainScript-kod från bördan att skicka runt indatadimensionerna. I vissa situationer är det dessutom mycket besvärligt att fastställa de exakta indatadimensionerna för ett lager, till exempel för det första helt anslutna lagret ovanpå en pyramid med kombinationer av convolution/pooling utan utfyllnad, där varje konvolutions- och poolåtgärd kan släppa rader eller kolumner med gränspixlar och steg skala dimensionerna.

Den här funktionen gör att CNTK:s fördefinierade skikt anges endast av deras utdatadimension (t.ex. DenseLayer{1024}).

Slumpmässig initiering

Slumpmässig initiering väljs av parametern init, som väljer mellan enhetlig och normal fördelning, där intervallet/standardavvikelsen beräknas som en funktion av in- och ut fläkt:

värdet för init fördelning intervall/standardavvikelse
"heNormal" normal sqrt (2 / fanIn)
"heUniform" uniform sqrt (6 /fanIn)
"glorotNormal" normal sqrt (2 / (fanIn +fanOut))
"glorotUniform" uniform sqrt (6 / (fanIn +fanOut))
"xavier" uniform sqrt (3 / fanIn)
"uniform" uniform 1/20
"gaussian" normal sqrt (0,04 / fanIn)
"noll" n/a 0

(Om zero är ett ibland praktiskt alternativ till att ange initValue=0.) För enhetlig fördelning initieras parametrarna enhetligt i [-range, range]; för normal fördelning är medelvärdet alltid noll.

Observera att standardvärdet för init är uniform när du använder ParameterTensor{} direkt. Standardvärdet är dock glorotUniform för lager som innehåller parametrar inuti, till exempel DenseLayer{} och ConvolutionalLayer{}.

In- och ut fläkt för slumpmässig initiering

Slumpmässig initiering förutsätter att parametrarna ingår i någon form av matrisproduktliknande åtgärd som har en väldefinierad in- och ut fläkt, som används för att fastställa skalningen av slumpmässiga värden per tabell ovan. Som standard betraktas den första axeln som utspringad och återstående axel/axlar är inbyggda och matchar semantik för den vanliga matrisprodukten.

Den valfria parametern initOutputRank kan användas för att ange antalet inledande axlar som ska betraktas som utrullningsbara. Till exempel för en matrisprodukt i CNTK:s utökade tensortolkning som mappar en [K]-dimensionell vektor x till ett [I x J]-dimensionellt rank-2-objekt kan skrivas som Times (W, x, outputRank=2), där W har formen [I x J x K]. Här anger initOutputRank=2 att vid skalning av slumpmässiga initieringsvärden är utskalningen I*J och K.

Negativa värden för initOutputRank anger att utspolningsaxlarna är avslutande axlar. Till exempel har filterkärnan för ConvolutionalLayer{} och den underliggande Convolution()-åtgärden för en typisk konfiguration av bildbearbetning en form [W x H x C x K], där K är fläkten, medan fläkten är W*H*C. Detta anges av initOutputRank=-1.

Läsa inledande värden från filer

De inledande värdena kan läsas från en textfil. Det gör du genom att skicka ett sökvägsnamn för den valfria parametern initFromFilePath. Textfilen förväntas bestå av en rad per matrisrader, som består av blankstegsavgränsade tal, en per kolumn. Rad- och kolumndimensionerna i filen måste matcha shape.

Parameterspecifik inlärningsfrekvens

Parameterspecifika inlärningsfrekvenser kan uppnås med den valfria learningRateMultiplier parametern. Den här faktorn multipliceras med den faktiska inlärningshastigheten när du utför parameteruppdateringar. Om parametern till exempel anges som 0 uppdateras den inte, den är konstant.

Exempel

En vanlig parametermatris som initieras som heUniform (standardvärdet är heNormal):

W = ParameterTensor {(outDim:inDim), init=`heUniform`}

En vanlig bias-parameter som initieras som noll:

b = ParameterTensor {outDim, initValue=0}

En inbäddningsmatris som ska läsas från en fil och behållas konstant:

E = ParameterTensor {(embedDim:vocabSize),
                     initFromFilePath='./EmbeddingMatrix.txt',
                     learningRateMultiplier=0}  # prevents learning

En biasparameter med full storlek på en [width x height]-storleksbild med numChannels färgplan:

bFull = ParameterTensor {(width:height:numChannels)}

Konstant{}

Skapa en konstant tensor.

Constant {scalarValue, rows=1, cols=1}

Parametrar

  • scalarValue: värdet för den här konstanten
  • rows (standard: 1): antal rader, om konstanten inte är en skalär
  • cols (standard: 1): antal cols, om konstanten inte är en skalär

Returvärde

En konstant, antingen ett skalärt eller ett rank-1- eller rank-2-objekt av dimensionen [rows x cols], där alla element fylls med scalarValue.

Beskrivning

Ett konstant värde. Det kan vara antingen ett skalärt eller ett rank-1-objekt (vektor) eller rank-2-objekt (matris) som initierats med ett enda värde (till exempel 0). Observera att eftersom för vektor- och matriskonstanter är alla värden identiska, kan konstanter som används tillsammans med elementbaserade åtgärder ofta anges som en skalär, samtidigt som du drar nytta av sändning.

Implementeringsanteckning:

En Constant() är en ParameterTensor{} med learningRateMultiplier=0.

Exempel

Interpolering mellan två värden med interpoleringsvikt alpha i intervallet 0..1 ("mjuk multiplexer"):

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

Hamming förlust (jfr här):

HammingLoss (y, p) = ReduceSum (BS.Boolean.Xor (y, Greater (p, Constant(0.5))))
hl = HammingLoss (multiLabels, probabilities)