어떻게 할까요? 브레인스크립트에서 항목을 표현합니다.
- BrainScript 구성 파일에 대한 좋은 구문 강조 표시를 받으시겠습니까 ?
- 이진 분류자의 오류 비율을 표시하시겠습니까?
- 온도 매개 변수를 사용하여 softmax를 표현하시겠습니까?
- 게이팅 메커니즘을 표현하시겠습니까?
- 동적 축 위에 소프트맥스를 표시하시겠습니까?
- 영역 아웃?
- 상수 3D 텐서 빌드
- BrainScript에서 벡터를 결합하거나 연결하시겠습니까?
- 학습 손실을 해석하시겠습니까?
BrainScript 구성 파일에 대한 멋진 구문 강조 표시 가져오기
사용하는 vim
경우 수행하는 방법은 다음과 같습니다. 다른 편집기도 유사해야 합니다.
:set syntax=conf
완벽하지는 않지만 구문 강조 표시가 없는 것보다 훨씬 낫습니다. 구문 파일을 작성하는 .vim
방법을 알고 있는 경우 끌어오기 요청을 보내주세요.
에맥에서 가장 conf-mode
적합합니다. 전환하려면 키를 눌러 M-x
명령 입력을 시작한 다음 conf-mode
. Windows Emacs에서도 conf-windows-mode
해당 모드가 주석의 특수 문자에 의해 혼동되는 것처럼 보입니다.
내 이진 분류자의 오류 비율 표현
ClassificationError는 다중 클래스 레이블에 대해서만 작동하기 때문에 사용하지 마세요. 표준 산술 연산자와 논리 연산자를 사용하여 다음으로 표현할 수 있습니다.
err = (label != (prediction > 0.5))
...
evaluationNodes = (err)
여기서 여기서 예측은 입력을 고려할 때 양수 클래스의 확률을 예측한다고 가정합니다.
온도 매개 변수를 사용하여 softmax 표현
BrainScript에서 온도 소프트맥스는 매우 쉽습니다.
TemperatureSoftmax (z, T) = Softmax (z / Constant (T))
게이팅 메커니즘 표현
가장 간단한 방법은 사용하는 것입니다.
BS.Boolean.If
(condition, thenExpression, elseExpression)
스칼라 및 텐서와 함께 작동합니다(모든 인수는 브로드캐스트할 수 있음).
동적 축 위에 소프트맥스 표현
동적 축에 대한 softmax는 되풀이를 통해 수행할 수 있습니다.
브레인스크립트:
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 (x, xprev) =
{
mask = Dropout (BS.Constants.OnesLike (x))
res = BS.Boolean.If (mask, xprev, x)
}.res
상수 3D 텐서 빌드
CNTK 상수 3D 텐서 빌드하려고 합니다. 나는 1D 및 2D 상수 배열을 생성하는 방법을 배웠습니다, 나는 그들을 스택 (연결 또는 결합)하고 반복 할 수 있습니다. 이제 3D 텐서 만들기 위해 2D 텐서가 쌓여야 하나요?
예를 들어 텐서가 3개 있다고 가정해 봅시다.
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] 텐서가 됩니다.)
새 차원을 스플라이스하려면 모든 입력의 차원이 일치해야 합니다. 예를 들어 축 3을 따라 ParameterTensor {100:200} 및 ParameterTensor {100:50}을(를) 쌓을 수 없습니다(하지만 축 2를 따라 누적하면 [100 x 250] 텐서).
또한 축 인덱스는 수학과 같이 1 기반입니다. 예를 들어 행렬의 행 차원은 첫 번째 축, 축=1이고 열 차원은 두 번째 축인 axis=2입니다.
학습 손실 해석
epoch가 완료된 후 CNTK 학습 손실을 굵게 계산하는 방법은 무엇인가요? 최종 모델이 전체 학습 집합을 통해 값을 가져오나요, 아니면 단순히 Epoch 중에 업데이트되는 동안 모델에 의해 생성된 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
대답은 후자입니다(평균은 가변 길이인 경우 미니배치의 샘플에 의해 가중치가 적용됩니다). 즉, Epoch의 끝에 있는 상태에서 모델의 실제 학습 손실을 받지 않습니다.