Angel中的损失函数

1. Angel中的损失函数

Angel中有丰富的损失函数, 可分为两类

  • 分类损失函数
  • 回归损失函数

分类损失函数如下表所示:

名称 表达式 描述
CrossEntoryLoss Angel中的损失函数 - 图1}) 用于分类, 逻辑回归是一种特例, 也可以用于多分类Softmax, 它要求输入是概率Angel中的损失函数 - 图2), 而不是Angel中的损失函数 - 图3)
LogLoss Angel中的损失函数 - 图4})}) 用于分类, 是逻辑回归的损失函数, 可以看成是CrossEntoryLoss函数的一种特列, 用Sigmoid的方式具体化了Angel中的损失函数 - 图5)
SoftmaxLoss Angel中的损失函数 - 图6\log\frac{x^{x_i}}{\sum_je^{x_j}}) 它是CrossEntoryLoss的特殊形式, 用Softmax的方式具体化了Angel中的损失函数 - 图7)
HingeLoss Angel中的损失函数 - 图8)}) SVM的损失函数

用图形化表示如下:

分类损失函数

回归损失函数如下表所示

名称 表达式 描述
L2Loss ![](http://latex.codecogs.com/png.latex?\ y-f(x)\ _2^2) 用于回归, 是最小二乘回归的损失函数
HuberLoss Angel中的损失函数 - 图10-\frac{\delta}{2}),&abs(x)>\delta\\\frac{1}{2}x^2,&abs(x)\le\delta\end{array}\right.) 用于回归, 它在0附近用二次函数, 在其它地方用一次函数, 解决了绝对值函数在0附近不可导的问题, 用Huber损失得到的模型较为橹棒

用图形化表示如下:

回归损失函数

2. Angel中Loss的实现

Angel中的损失函数都实现了LossFunc Trait, 如下:

  1. trait LossFunc extends Serializable {
  2. def calLoss(modelOut: Matrix, graph: AngelGraph): Double
  3. def loss(pred: Double, label: Double): Double
  4. def calGrad(modelOut: Matrix, graph: AngelGraph): Matrix
  5. def predict(modelOut: Matrix): Matrix
  6. }

可见, angel中的loss的不仅有计算loss的功能, 还有计算梯度, 预测两项功能. 正是由于在Loss中实现了梯度计算, 才使反向传导有了起点. 在LossLayer中计算梯度就是直接调用lossFunc的calGrad, 如下:

  1. override def calGradOutput(): Matrix = {
  2. val start = System.currentTimeMillis()
  3. status match {
  4. gradOutput = lossFunc.calGrad(output, graph)
  5. status = STATUS.Backward
  6. case _ =>
  7. }
  8. val end = System.currentTimeMillis()
  9. gradOutput
  10. }

另外一项功能是预测, 在LossLayer中计算预测值就是直接调用lossFunc的predict, 如下:

  1. override def predict(): Matrix = {
  2. status match {
  3. case STATUS.Null =>
  4. calOutput()
  5. case _ =>
  6. }
  7. lossFunc.predict(output)
  8. }

3. Loss Function的Json

3.1 无参数的损失函数

除了huberloss外, 其它的lossfunc匀为无参数的损失函数, 有两种表达方式, 如下

  1. "lossfunc": "logloss"
  2. "lossfunc": {
  3. "type": "logloss"
  4. }

3.2 参数的损失函数

只有huberloss, 具体如下:

  1. "lossfunc": {
  2. "type": "huberloss",
  3. "delta": 0.1
  4. }