jrae源代码解析(二)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

本文细述上文引出的RAECost和SoftmaxCost两个类。

SoftmaxCost

我们已经知道。SoftmaxCost类在给定features和label的情况下(超參数给定),衡量给定权重(hidden×catSize)的误差值cost,并指出当前的权重梯度。看代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@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;
     }<br><br> public  DoubleMatrix getPredictions (ClassifierTheta Theta, DoubleMatrix Features)<br>    {<br>         int  numDataItems = Features.columns;<br>        DoubleMatrix Input = ((Theta.W.transpose()).mmul(Features)).addColumnVector(Theta.b);<br>        Input = DoubleMatrix.concatVertically(Input, DoubleMatrix.zeros( 1 ,numDataItems));<br>         return  Activation.valueAt(Input); <br>    }

 是个典型的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):

Ewij=Epjhjnetjxi=1pjpj(1pj)xi=(1pj)xi=(labeljpj)featurei

因此我们便理解了以下代码的含义:

1
DoubleMatrix Delta = Features.mmul(Diff.transpose());

 

RAECost

先看实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@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。程序遍历每一个样本,用featureCost.Compute(Data)生成一个递归树,同一时候累加cost和gradient。然后用classificationCost.Compute(Data, Tree)依据生成的树计算并累加cost和gradient。因此关键类为RAEFeatureCost和RAEClassificationCost。

RAEFeatureCost类在Compute函数中调用RAEPropagation的ForwardPropagate函数生成一棵树。然后调用BackPropagate计算梯度并累加。详细的算法过程。下一章分解。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5344125.html,如需转载请自行联系原作者 

相关文章
|
5月前
|
JavaScript 前端开发
Vue 应用 main.js 里的源代码解析
Vue 应用 main.js 里的源代码解析
|
3月前
|
Unix Linux Shell
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
Sphinx是一个Python文档生成工具,它可以解析reStructuredText或Markdown格式的源代码注释,并生成多种输出格式,如HTML、LaTeX、PDF、ePub等。
|
4月前
|
人工智能 缓存 Java
技术经验解读:【转】详细解析用C#写的小游戏《彩色连珠》(附源代码)
技术经验解读:【转】详细解析用C#写的小游戏《彩色连珠》(附源代码)
22 0
|
5月前
|
SQL 数据采集 Java
Java【代码分享 02】商品全部分类数据获取(建表语句+Jar包依赖+树结构封装+获取及解析源代码)包含csv和sql格式数据下载可用
Java【代码分享 02】商品全部分类数据获取(建表语句+Jar包依赖+树结构封装+获取及解析源代码)包含csv和sql格式数据下载可用
70 0
|
数据挖掘 数据安全/隐私保护 开发者
MATLAB P文件解密工具让你轻松破解p文件,解析源代码!
这篇文章将为你推荐一个MATLAB P文件解密工具,可以将p文件解密成m文件,反编译p代码为m代码,并还原p文件或m文件的源代码。
1579 0
|
存储 算法 Java
Go源代码解析-slice.go文件
Go源代码解析-slice.go文件
80 0
|
存储 安全 算法
Go源代码解析-sema.go文件
Go源代码解析-sema.go文件
71 0
阿里巴巴商品详情pachong数据字段解析 源代码分享 调用示例
阿里巴巴商品详情pachong数据字段解析 源代码分享 调用示例
|
Linux 程序员 开发工具
Android核心服务解析篇(一)——下载Android源代码
Android核心服务解析篇(一)——下载Android源代码
209 0
Android核心服务解析篇(一)——下载Android源代码
全网最硬核 JVM TLAB 分析 5. TLAB 源代码全解析(下)
全网最硬核 JVM TLAB 分析 5. TLAB 源代码全解析(下)

推荐镜像

更多