Поделиться через


Разделы справки выражать вещи в BrainScript

Получение хорошего синтаксиса для файлов конфигурации BrainScript

Вот как это сделать, если вы используете vim; другие редакторы должны быть похожими

:set syntax=conf

Это не идеально, но это гораздо лучше, чем отсутствие выделения синтаксиса. Если вы знаете, как написать файл синтаксиса .vim , отправьте нам запрос на вытягивание.

В Emacs conf-mode лучше всего подходит. Чтобы переключиться, нажмите, M-x чтобы начать ввод команд, а затем введите conf-mode. На Windows Emacs также естьconf-windows-mode, однако этот режим, как представляется, иногда запутается специальными символами в комментариях.

Выражение частоты ошибок двоичного классификатора

Не используйте ClassificationError, так как он работает только для многоклассовых меток. Используя стандартные арифметические и логические операторы, вы можете выразить это как

err = (label != (prediction > 0.5))
...
evaluationNodes = (err)  

где мы предполагаем, что прогноз — это оценка вероятности положительного класса с учетом входных данных.

Выражение softmax с параметром температуры

Температура softmax очень проста в BrainScript

TemperatureSoftmax (z, T) = Softmax (z / Constant (T))

Экспресс-механизм выделения

Самый простой способ — использовать

BS.Boolean.If (condition, thenExpression, elseExpression)

который работает с скалярами, а также тензорами (все аргументы могут транслироваться).

Выражение softmax по динамической оси

Softmax по динамической оси можно выполнить с помощью повторения:

BrainScript:

SoftMaxOverSequence (z) = {
    # define a recursive expression for \log(\sum_{i=1}^t \exp(z_i))
    runningLogSumExp = LogPlus (z,
                           PastValue (0, runningLogSumExp, defaultHiddenActivation=-1e30)) 
    logSumExp = If (BS.Loop.IsLast (runningLogSumExp),  # if last entry
                /*then*/ runningLogSumExp,              # then copy that
                /*else*/ FutureValue (0, logSumExp))    # else just propagate to the front
    result = Exp (z - logSumExp)
}.result

Реализация zoneout

Может возникнуть вопрос о том, применяется ли раскрывающийся список к константе динамически. Но это так! Таким образом , zoneout так же прост, как

Zoneout (x, xprev) =
{
    mask = Dropout (BS.Constants.OnesLike (x))
    res = BS.Boolean.If (mask, xprev, x)
}.res

Создание константного трехмерного тензора

Я хочу создать постоянный трехмерный тензор в CNTK. Я узнала, как создавать 1D и 2D-массивы констант, я могу стек (сцепить или объединить) их и повторить. Теперь мне нужно сложить 2D Tensors, чтобы сделать трехмерный тензор?

Предположим, у вас есть три тензора, например

A = ParameterTensor {100:200}
B = ParameterTensor {100:200}
C = ParameterTensor {100:200}

Теперь вы можете сказать

    ABC = Splice (A:B:C, axis=3)

который даст вам тензор [100 x 200 x 3].

(Если, с другой стороны, вы говорите Splice (A:B:C, axis=1), вы бы получили тензор [300 x 200], и Splice (A:B:C, axis=2) получит тензор [100 x 600].)

Обратите внимание, что для спления в новом измерении измерения все входные данные должны совпадать. Например, нельзя сложить параметрTensor {100:200} и ParameterTensor {100:50} вдоль оси 3 (но его можно сложить вдоль оси 2, что даст вам тензор [100 x 250]).

Также обратите внимание, что индексы оси основаны на 1, как в математике. Например, измерение строки матрицы — это первая ось, ось=1, а измерение столбца — вторая ось, ось=2.

Интерпретация потери обучения

Как CNTK вычислять потерю обучения (полужирным шрифтом) после завершения эпохи? Проходит ли окончательная модель через весь обучающий набор для получения значения или просто усредняет потери обучения miniBatch, создаваемые моделью, пока она обновляется во время эпохи?

Finished Epoch[ 1 of 100]: [Training] CE = 0.15920662 * 59999999; totalSamplesSeen = 59999999; learningRatePerSample = 9.9999997e-05; epochTime=641.392s
Final Results: Minibatch[1-3510]: CE = 0.32190538 * 3592929
Finished Epoch[ 1 of 100]: [Validate] CE = 0.32190538 * 3592929

Ответ — это последнее (где усреднение взвешается выборками в мини-бэтче, если они имеют переменную длину). Т.е. вы не получаете фактическую потерю обучения модели в состоянии, в конце эпохи.