本文细述上文引出的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):

∂E∂wij=∂E∂pj∂hj∂netjxi=−1pjpj(1−pj)xi=−(1−pj)xi=−(labelj−pj)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计算梯度并累加。详细的算法过程。下一章分解。

jrae源代码解析(二)的更多相关文章

  1. Spring源代码解析

    Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的启动:http://www.itey ...

  2. Spring源代码解析(收藏)

    Spring源代码解析(收藏)   Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的 ...

  3. C#使用zxing,zbar,thoughtworkQRcode解析二维码,附源代码

    最近做项目需要解析二维码图片,找了一大圈,发现没有人去整理下开源的几个库案例,花了点时间 做了zxing,zbar和thoughtworkqrcode解析二维码案例,希望大家有帮助. zxing是谷歌 ...

  4. NIO框架之MINA源代码解析(二):mina核心引擎

    NIO框架之MINA源代码解析(一):背景 MINA的底层还是利用了jdk提供了nio功能,mina仅仅是对nio进行封装.包含MINA用的线程池都是jdk直接提供的. MINA的server端主要有 ...

  5. SDWebImage源代码解析(二)

    上一篇:SDWebImage源代码解析(一) 2.缓存 为了降低网络流量的消耗.我们都希望下载下来的图片缓存到本地.下次再去获取同一张图片时.能够直接从本地获取,而不再从远程server获取.这样做的 ...

  6. redis之字符串命令源代码解析(二)

    形象化设计模式实战             HELLO!架构                     redis命令源代码解析 在redis之字符串命令源代码解析(一)中讲了get的简单实现,并没有对 ...

  7. asp.net C#生成和解析二维码代码

    类库文件我们在文件最后面下载 [ThoughtWorks.QRCode.dll 就是类库] 使用时需要增加: using ThoughtWorks.QRCode.Codec;using Thought ...

  8. Fixflow引擎解析(二)(模型) - BPMN2.0读写

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  9. Arrays.sort源代码解析

    Java Arrays.sort源代码解析 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类 ...

随机推荐

  1. POJ2221+模拟

    参考http://blog.sina.com.cn/s/blog_7de5c6210100tm1h.html 其实是水题............ #include<string.h> #i ...

  2. edX Devstack 汉化(i18n)

    操练了几日edx Devstack后,发现自己e文还是那么poor,如果和我一样,继续往下看,否则可以轻轻的飘过- 1.运行起 edx Devstack cd /devstack vagrant up ...

  3. *[topcoder]TheTree

    http://community.topcoder.com/stat?c=problem_statement&pm=12746&rd=15703 这道题有意思.给了树的根和每层节点的个 ...

  4. Android WebView 开发详解(一)

    转载请注明出处  http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao 概览: Android ...

  5. 手势识别官方教程(6)识别拖拽手势用GestureDetector.SimpleOnGestureListener和onTouchEvent

    三种现实drag方式 1,在3.0以后可以直接用 View.OnDragListener (在onTouchEvent中调用某个view的startDrag()) 2,onTouchEvent()  ...

  6. 【HDOJ】2155 小黑的镇魂曲

    线段树+SPFA最短路可以过.或者DP也能过.需要注意的是xl的范围是错的,测试用例中xl可能为0,他妈的,因为这个一直莫名其妙的wa.1. spfa建图增加一倍的点即可(讨论左端点和右端点). /* ...

  7. lnmp.org一键安装包

    LNMP安装快速导航:LNMP安装提示,LNMP安装教程.安装失败处理.虚拟主机管理.可选组件.LNMP文件目录说明.状态管理. 系统需求: CentOS/Debian/Ubuntu Linux系统 ...

  8. Oracle Java SE远程安全漏洞(CVE-2013-5878)

    漏洞版本: Oracle Java SE 7u45 Oracle Java SE 6u65 漏洞描述: BUGTRAQ ID: 64927 CVE(CAN) ID: CVE-2013-5878 Jav ...

  9. BrnMall多店版网上商城正式发布

    前些日子一直忙于多店版网上商城系统BrnMall的开发,工作比较多,所以博客断了.这几天项目完成了,时间比较自由,所以把这段时间总结的一些关于单店版BrnShop和多店版BrnMall区别写下来,希望 ...

  10. maven安装步骤

    第一步:配置maven环境 maven3 安装: 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Maven是 Apache 下的一个项目,目前最新版本是 3.0.4,我用的也是这个. ...