jrae 원본 코드 해석 (2)

4392 단어 원본 코드
본고는 위에서 인용한 RAECost와 SoftmaxCost 두 종류를 상세하게 기술한다.
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를 호출하여 사다리를 계산하고 누적합니다.구체적인 알고리즘 과정은 다음 장에서 분해한다.

좋은 웹페이지 즐겨찾기