Dela via


BrainScript minibatchSize i CNTK

Obs! För BrainScript-användare är minibatchSizeparametern för minibatchstorlek , för Python användare är minibatch_size_in_samplesden . Information om Python användare finns här.

CNTK har en mycket specifik definition av minibatchSize parameter: Det anger antalet exempel mellan modelluppdateringar. Ett exempel här definieras som en vektor eller tensor som flödar genom systemet. I en bildigenkänningsaktivitet är till exempel en bild ett exempel.

Minibatchstorleken för varje epok, som anges i exempel (tensorer längs en dynamisk axel). Standardvärdet är 256. Du kan använda olika värden för olika epoker, t.ex. 128*2:1024 (i BrainScript) eller 128*2 + 1024 (i Python) innebär att minibatchstorleken 128 används för de två första epokerna och sedan 1024 för resten. Observera att "Minibatch size" i CNTK innebär antalet prover som bearbetas mellan modelluppdateringar. Den här definitionen gäller även vid parallellisering mellan arbetare (t.ex. för K arbetare är minibatchSize/Kantalet prover som varje arbetare bearbetar ). När det gäller indata minibatchSize med variabel längd refererar till antalet objekt i dessa sekvenser, inte antalet sekvenser. SGD försöker anpassa upp till så många sekvenser som möjligt i minibatch som inte överskrider minibatchSize det totala antalet prover. Om flera indata anges läggs tensorer till i den aktuella minibatchen tills någon av indata överskrider minibatchSize.

För sekventiella data är ett exempel ett enskilt objekt i en sekvens. Därför refererar CNTK minibatchSizeinte till antalet sekvenser i minibatchen, utan det aggregerade antalet sekvensobjekt/token i sekvenserna som utgör minibatchen. CNTK har inbyggt stöd för sekvenser med variabel längd, d.v.s. det kan hantera sekvenser med mycket varierande längd inom samma minibatch, utan behov av lösningar som bucketing. Tillsammans med CNTK begrepp om att ange inlärningsfrekvensen per prov (i stället för ett minibatch-medelvärde) bidrar varje objekt i sekvenser med valfri längd på samma sätt till toningen, vilket leder till konsekvent konvergens. (Många andra verktyg definierar minibatchstorleken för sekventiella data som antalet sekvenser i minibatchen. Detta är problematiskt, särskilt om toningar också definieras som minibatch-medelvärden snarare än CNTK minibatchsummor, eftersom bidraget till toningen från varje token eller steg i en sekvens skulle vara omvänt proportionellt mot sekvenslängden. CNTK metod undviker detta.)

När flera Input{}s används är det möjligt att inte alla indata har samma sekvenslängd. I sekvensklassificering är till exempel etiketten för varje sekvens en enda token. I det här fallet styr indata med det största antalet exempel minibatchstorleken. (Du kan ändra det här beteendet genom att definesMbSize=True ange för vissa indata. Sedan räknas minibatchstorleken baserat på sekvenserna från just den här indatan. När flera indata har angetts kan endast en enda ha definesMbSize angetts till True.)

Trots vår tydliga definition av minibatchSize att vara antalet exempel mellan modelluppdateringar finns det två tillfällen då vi måste lätta på definitionen:

  • sekventiella data: Sekvenser med variabel längd summerar vanligtvis inte upp till exakt den begärda minibatchstorleken. I det här fallet packas så många sekvenser som möjligt i en minibatch utan att överskrida den begärda minibatchstorleken (med ett undantag: Om nästa sekvens i den randomiserade corpus överskrider längden på minibatchstorleken består minibatchstorleken av den här sekvensen).
  • dataparallellitet: Här är minibatchstorleken ungefärlig, eftersom vår segmentbaserade randomiseringsalgoritm inte kan garantera att varje arbetare får exakt samma antal exempel.

Alla ovanstående överväganden gäller även för epochSize, men epochSize har vissa skillnader, se här.