jrae 원본 코드 해석 (2)
4392 단어 원본 코드
SoftmaxCost
SoftmaxCost 클래스가 주어진features와 label의 경우 (초파라미터 주어짐) 주어진 권한 중 ($hidden\times catsize$) 의 오차값 $cost$을 측정하고 현재의 권한 중 사다리를 가리키는 것을 알고 있습니다.코드를 보다.
@Override
public double valueAt(double[] x)
{
if( !requiresEvaluation(x) )
return value;
int numDataItems = Features.columns;
int[] requiredRows = ArraysHelper.makeArray(0, CatSize-2);
ClassifierTheta Theta = new ClassifierTheta(x,FeatureLength,CatSize);
DoubleMatrix Prediction = getPredictions (Theta, Features);
double MeanTerm = 1.0 / (double) numDataItems;
double Cost = getLoss (Prediction, Labels).sum() * MeanTerm;
double RegularisationTerm = 0.5 * Lambda * DoubleMatrixFunctions.SquaredNorm(Theta.W);
DoubleMatrix Diff = Prediction.sub(Labels).muli(MeanTerm);
DoubleMatrix Delta = Features.mmul(Diff.transpose());
DoubleMatrix gradW = Delta.getColumns(requiredRows);
DoubleMatrix gradb = ((Diff.rowSums()).getRows(requiredRows));
//Regularizing. Bias does not have one.
gradW = gradW.addi(Theta.W.mul(Lambda));
Gradient = new ClassifierTheta(gradW,gradb);
value = Cost + RegularisationTerm;
gradient = Gradient.Theta;
return value;
}
public DoubleMatrix getPredictions (ClassifierTheta Theta, DoubleMatrix Features)
{
int numDataItems = Features.columns;
DoubleMatrix Input = ((Theta.W.transpose()).mmul(Features)).addColumnVector(Theta.b);
Input = DoubleMatrix.concatVertically(Input, DoubleMatrix.zeros(1,numDataItems));
return Activation.valueAt(Input);
}
전형적인 2층 신경 네트워크로 은층이 없다. 우선features에 따라 labels를 예측하고 예측 결과는softmax로 귀일화한 다음에 오차에 따라 역방향 전파에 따라 권중계단도를 계산한다.
여기 200자 추가.
이 전형적인 2층 신경 네트워크는 label이 일렬 벡터이고 목표 label은 1이고 나머지는 0이다.변환 함수는softmax 함수이고, 출력은 모든 label의 확률입니다.
cost를 계산하는 함수는 getLoss이고 목표 label의 예측 출력이 $p^*$이라고 가정하면 각 견본의 cost도 오차 함수는 다음과 같다.
$$cost=E(p^*)=-\log(p^*)$$
앞에서 말한 신경 네트워크 후방 전파 알고리즘에 따라 ($j$이 목표 label일 때 그렇지 않으면 0):
$$\frac{\partial E}{\partial w_{ij}}=\frac{\partial E}{\partial p_j}\frac{\partial h_j}{\partial net_j}x_i=-\frac{1}{p_j}p_j(1-p_j)x_i=-(1-p_j)x_i=-(label_j-p_j)feature_i$$
그래서 우리는 다음 코드의 의미를 이해했다.
DoubleMatrix Delta = Features.mmul(Diff.transpose());
RAECost
먼저 실현 코드를 보십시오:
@Override
public double valueAt(double[] x)
{
if(!requiresEvaluation(x))
return value;
Theta Theta1 = new Theta(x,hiddenSize,visibleSize,dictionaryLength);
FineTunableTheta Theta2 = new FineTunableTheta(x,hiddenSize,visibleSize,catSize,dictionaryLength);
Theta2.setWe( Theta2.We.add(WeOrig) );
final RAEClassificationCost classificationCost = new RAEClassificationCost(
catSize, AlphaCat, Beta, dictionaryLength, hiddenSize, Lambda, f, Theta2);
final RAEFeatureCost featureCost = new RAEFeatureCost(
AlphaCat, Beta, dictionaryLength, hiddenSize, Lambda, f, WeOrig, Theta1);
Parallel.For(DataCell,
new Parallel.Operation<LabeledDatum<Integer,Integer>>() {
public void perform(int index, LabeledDatum<Integer,Integer> Data)
{
try {
LabeledRAETree Tree = featureCost.Compute(Data);
classificationCost.Compute(Data, Tree);
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
});
double costRAE = featureCost.getCost();
double[] gradRAE = featureCost.getGradient().clone();
double costSUP = classificationCost.getCost();
gradient = classificationCost.getGradient();
value = costRAE + costSUP;
for(int i=0; i<gradRAE.length; i++)
gradient[i] += gradRAE[i];
System.gc(); System.gc();
System.gc(); System.gc();
System.gc(); System.gc();
System.gc(); System.gc();
return value;
}
cost는 두 부분으로 구성되어 있는데,featureCost와classificationCost이다.프로그램이 모든 견본을 옮겨다니며,feature Cost를 사용합니다.Compute (Data) 는 컴포지팅 트리를 생성하고cost와gradient를 누적한 다음classificationCost를 사용합니다.Compute(Data, Tree)는 생성된 트리에 따라 cost와gradient를 계산하고 누적합니다.따라서 주요 클래스는 RAEFeatureCost 및 RAEClassificationCost입니다.
RAEFeatureCost 클래스는 Compute 함수에서 RAEpropagation의ForwardPropagate 함수를 호출하여 나무를 생성한 다음 BackPropagate를 호출하여 사다리를 계산하고 누적합니다.구체적인 알고리즘 과정은 다음 장에서 분해한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Asp와 XML로 상호작용하는 실례 원본XML은 표준 확장 언어로 미래 웹 프로그래밍의 표준이다. asp는 현재 널리 전해지는 웹 프로그래밍 언어 중의 하나이다. 그들 두 사람이 연합하여 역할을 발휘할 수 있을까?두부는 여기서 여러분에게 아주 간단한 As...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.