Angel中的大部分算法都是基于计算图的, 图中的节点为层(layer). 按层的拓朴结构可分为三类:
Angel中的输入层有两类:
顾名思义, 它是接受输入的. 类的构造函数如下:
class SimpleInputLayer(name: String, outputDim: Int, transFunc: TransFunc, override val optimizer: Optimizer)(implicit graph: AngelGraph)
extends InputLayer(name, outputDim)(graph) with Trainable
它的主要特点为:
完成的计算用公式表达为:
一种典型的json表达为:
{
"name": "wide",
"type": "Simpleinputlayer",
"outputdim": 10,
"transfunc": "identity",
"optimizer": "adam"
},
Embedding是很多深度学习算法共有的. 类的构造函数如下:
class Embedding(name: String, outputDim: Int, val numFactors: Int, override val optimizer: Optimizer)(implicit graph: AngelGraph)
extends InputLayer(name, outputDim)(graph) with Trainable
除了name与optimizer这两个参数据外, Embedding的其它两个参数如下:
Embedding在抽象意义上是一张表, 并提供查表的方法(lookup/calOutput). Angel的Embedding的特别之处在于查完表后还允许有一些运算, 所以包括两个步骤:
下面展示值为1(one-hot编码的结果, 用dummy格式表示)与值为浮点数(用libsvm格式表示)两种情况下稀疏向量embedding的结果:
一种典型的json表达为:
{
"name": "embedding",
"type": "Embedding",
"numfactors": 8,
"outputdim": 104,
"optimizer": {
"type": "momentum",
"momentum": 0.9,
"reg2": 0.01
}
},
线性层是指有且只有一个输入一个输出的层. 主要包括全联接层(FCLayer)和一系列的特征交叉层.
FCLayer层是DNN中最常见的层, 其计算可用下面的公式表达:
在Angel中的构造函数如下:
class FCLayer(name: String, outputDim: Int, inputLayer: Layer, transFunc: TransFunc, override val optimizer: Optimizer
)(implicit graph: AngelGraph) extends LinearLayer(name, outputDim, inputLayer)(graph) with Trainable
从构造函数与计算公式可知, 它与DenseInputLayer/SparseInputLayer十分相似, 有所不同的是前者的输入是一个Layer, 后者直接输入数据(在构造函数中不要指定输入Layer).
在参数据存储上, FCLayer与DenseInputLayer一样, 也使用稠密的方式, 用BLAS计算.
由于FCLayer通常是多个叠在一起使用, 在参数据配置方面做了一些简化, 即将多个叠在一起的FCLayer的参数约简, 下面是一个例子:
{
"name": "fclayer",
"type": "FCLayer",
"outputdims": [
100,
100,
1
],
"transfuncs": [
"relu",
"relu",
"identity"
],
"inputlayer": "embedding"
},
这里有三个FCLayer叠在一起, 输入是第一层的输入, 输出为最后一层的输出, 每一层的outputdim, transfunc用列表示, 即:
注: 也可以为叠合的FCLayer指定optimizer, 此时, 所有layer都有相同的optimizer. 如果分开写则为:
{
"name": "fclayer_0",
"type": "FCLayer",
"outputdim": 100,
"transfuncs": "relu",
"inputlayer": "embedding"
},
{
"name": "fclayer_1",
"type": "FCLayer",
"outputdim": 100,
"transfuncs": "relu",
"inputlayer": "fclayer_0"
},
{
"name": "fclayer",
"type": "FCLayer",
"outputdim": 1,
"transfuncs": "identity",
"inputlayer": "fclayer_1"
},
特征交叉层, 计算公式如下:
其中是Embedding的输出结果. 具体而言是Embedding结果做两两内积, 再求和. 因此BiInnerSumCross没有参数, 是untrainable的, 输出维度为1.
构造函数如下:
class BiInnerSumCross(name: String, inputLayer: Layer)(
implicit graph: AngelGraph) extends LinearLayer(name, 1, inputLayer)(graph)
json参数例子如下:
{
"name": "biinnersumcross",
"type": "BiInnerSumCross",
"inputlayer": "embedding",
"outputdim": 1
},
特征交叉层, 计算公式如下:
其中是Embedding的输出结果. 具体而言是Embedding结果做两两内积, 因此输出的维度为. 由此可见, BiInnerCross也是没有参数, 是untrainable的, 输出维度为.
构造函数如下:
class BiInnerCross(name: String, outputDim: Int, inputLayer: Layer)(
implicit graph: AngelGraph) extends LinearLayer(name, outputDim, inputLayer)(graph)
json参数例子如下:
{
"name": "biInnerCross",
"type": "BiInnerCross",
"outputdim": 78,
"inputlayer": "embedding"
},
特征交叉层, 计算公式如下:
其中是Embedding的输出结果. 具体而言是Embedding结果做两两对应元素积, 再相和, 因此输出的维度为与相同, 与输入数据的维度元关. 由此可见, BiInteactionCross也是没有参数, 是untrainable的.
构造函数如下:
class BiInteractionCross(name: String, outputDim: Int, inputLayer: Layer)(
implicit graph: AngelGraph) extends LinearLayer(name, outputDim, inputLayer)(graph)
json参数例子如下:
{
"name": "biinteractioncross",
"type": "BiInteractionCross",
"outputdim": 8,
"inputlayer": "embedding"
},
join层是指有多个输入一个输出的层, 主要有:
将多个输入层拼接起来, 输入一个Dense矩阵, 构造函数如下:
class ConcatLayer(name: String, outputDim: Int, inputLayers: Array[Layer])(implicit graph: AngelGraph)
extends JoinLayer(name, outputDim, inputLayers)(graph)
json参数例子如下:
{
"name": "concatlayer",
"type": "ConcatLayer",
"outputdim": 182,
"inputlayers": [
"embedding",
"biInnerCross"
]
},
有多个输入层, 用inputlayers, 以列表的形式指定.
将输入元素对应相加后输出, 输出一个Dense矩阵, 构造函数如下:
class SumPooling(name: String, outputDim: Int, inputLayers: Array[Layer])(implicit graph: AngelGraph)
extends JoinLayer(name, outputDim, inputLayers)(graph)
json参数例子如下:
{
"name": "sumPooling",
"type": "SumPooling",
"outputdim": 1,
"inputlayers": [
"wide",
"fclayer"
]
},
有多个输入层, 用inputlayers, 以列表的形式指定.
将输入元素对应相乘后输出, 输出一个Dense矩阵, 构造函数如下:
class MulPooling(name: String, outputDim: Int, inputLayers: Array[Layer])(implicit graph: AngelGraph)
extends JoinLayer(name, outputDim, inputLayers)(graph)
json参数例子如下:
{
"name": "mulPooling",
"type": "MulPooling",
"outputdim": 1,
"inputlayers": [
"wide",
"fclayer"
]
},
有多个输入层, 用inputlayers, 以列表的形式指定.
先将对应元素相乘, 然后按行相加, 输出n行一列的矩阵, 构造函数如下:
class DotPooling(name: String, outputDim: Int, inputLayers: Array[Layer])(implicit graph: AngelGraph)
extends JoinLayer(name, outputDim, inputLayers)(graph)
json参数例子如下:
{
"name": "dotPooling",
"type": "DotPooling",
"outputdim": 1,
"inputlayers": [
"wide",
"fclayer"
]
},
有多个输入层, 用inputlayers, 以列表的形式指定.
在网络的最上层, 只有输入层, 没有输出层, 用于计算损失. 关于损失函数, 请参考Angel中的损失函数
SimpleLossLayer的构造函数如下:
class SimpleLossLayer(name: String, inputLayer: Layer, lossFunc: LossFunc)(
implicit graph: AngelGraph) extends LinearLayer(name, 1, inputLayer)(graph) with LossLayer
json参数例子如下:
{
"name": "simplelosslayer",
"type": "Simplelosslayer",
"lossfunc": "logloss",
"inputlayer": "sumPooling"
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。