DNN

DNN是每个深度学习平台第一个要支持的算法. Angel作为一个深度学习平台, 并没有内置DNN的实现, 但它提供了一种方法让用户实现自已的深度学习算法. 事实上, DeepFM, PNN, NFM, Deep and Wide等算法匀可用本文所述的方法实现.

DNN

Angel提供了用Json配置算法的功能, 同时也提供了用Json定义算法的功能. 下面以DNN的实现为例说明.

1. Json定义网络

1.1 输入层的定义

  1. {
  2. "name": "denseinputlayer",
  3. "type": "simpleinputlayer",
  4. "outputdim": 500,
  5. "transfunc": "relu",
  6. "optimizer": "ftrl"
  7. },

这里用一个DenseInputLayer作为输入层, 输出维度为500, 用Relu作为传递函数. 为了其它层能引用它, 给输入层命名为”denseinputlayer”.

需要特别指出的是, Angel允许网络的不同部分使用不同的优化器, 这里指定DenseInputLayer使用FTRL优化器(关于优化器, 请参考Angel中的优化器)

1.2 FCLayer的定义

  1. {
  2. "name": "fclayer",
  3. "type": "FCLayer",
  4. "outputdims": [
  5. 100,
  6. 1
  7. ],
  8. "transfuncs": [
  9. "relu",
  10. "identity"
  11. ],
  12. "inputlayer": "denseinputlayer"
  13. },

有两个FCLayer:

  • 第一个FCLayer
    • 名称为”fclayer_0”
    • 输出维度为100
    • 传递函数为”Relu”
  • 第二个FCLayer
    • 名称为”fclayer”
    • 输出维度为1
    • 传递函数为”identity”

从上可以看出, FCLayer使用了简约的书写方式, 请参考Json的定义. 简约方式的inputlayer为第一个FCLayer的输入, 简约方式的name为最后一个FCLayer的name. 中间的Layer命名方式是”fclayer_x”, 表示FCLayer的编号, 从0开始.

另外, 简约形式的FCLayer的输入是上层”denseinputlayer”的输出.

注: FCLayer没有指定optimizer, 则它会使用默认的optimizer, 即Momentum.

1.3 损失层的定义

  1. {
  2. "name": "simplelosslayer",
  3. "type": "simplelosslayer",
  4. "lossfunc": "logloss",
  5. "inputlayer": "fclayer"
  6. }

损失的类型是SimpleLossLayer, 损失函数为”logloss”, 输入层是”fclayer”

2. 数据相关参数的定义

  1. "data": {
  2. "format": "libsvm",
  3. "indexrange": 300,
  4. "validateratio": 0.2,
  5. "posnegratio": 0.1
  6. },

详细参数的意义请参考Json的定义. 这里只列出了如下几个参数:

  • format: 输入数据的格式
  • indexrange: 特征维度
  • validateratio: 验证集的比例
  • posnegratio: 打开采样, 并设置正负样本的比例

3. 定义模型相关参数

  1. "model": {
  2. "modeltype": "T_DOUBLE_SPARSE",
  3. "modelsize": 300
  4. },

详细参数的意义请参考Json的定义. 这里只列出几个参数:

  • 模型类型: T_DOUBLE_SPARSE
  • 模型大小: 模型的实际大小(有效特征的个数)

4. 定义训练参数

  1. "train": {
  2. "epoch": 30,
  3. "numupdateperepoch": 10,
  4. "lr": 0.1,
  5. "decayclass": "WarmRestarts",
  6. "decaybeta": 0.001
  7. },

详细参数的意义请参考Json的定义. 这里只列出几个参数:

  • epoch: 训练轮数
  • lr: 学习率
  • decayclass: 学习率衰减系类
  • decayalpha: 学习率衰减参数
  • decaybeta: 学习率衰减参数

5. 将所有配置放在一起

  1. {
  2. "data": {
  3. "format": "libsvm",
  4. "indexrange": 300,
  5. "validateratio": 0.2,
  6. "posnegratio": 0.1
  7. },
  8. "model": {
  9. "modeltype": "T_DOUBLE_SPARSE",
  10. "modelsize": 300
  11. },
  12. "train": {
  13. "epoch": 30,
  14. "lr": 0.1,
  15. "decayclass": "WarmRestarts",
  16. "decaybeta": 0.001
  17. },
  18. "default_optimizer": "momentum",
  19. "layers": [
  20. {
  21. "name": "simpleinputlayer",
  22. "type": "simpleinputlayer",
  23. "outputdim": 500,
  24. "transfunc": "relu"
  25. },
  26. {
  27. "name": "fclayer",
  28. "type": "FCLayer",
  29. "outputdims": [
  30. 100,
  31. 1
  32. ],
  33. "transfuncs": [
  34. "relu",
  35. "identity"
  36. ],
  37. "inputlayer": "denseinputlayer"
  38. },
  39. {
  40. "name": "simplelosslayer",
  41. "type": "simplelosslayer",
  42. "lossfunc": "logloss",
  43. "inputlayer": "fclayer"
  44. }
  45. ]
  46. }

6. 提效脚本

  1. runner="com.tencent.angel.ml.core.graphsubmit.GraphRunner"
  2. modelClass="com.tencent.angel.ml.core.graphsubmit.GraphModel"
  3. $ANGEL_HOME/bin/angel-submit \
  4. --angel.job.name DeepFM \
  5. --action.type train \
  6. --angel.app.submit.class $runner \
  7. --ml.model.class.name $modelClass \
  8. --angel.train.data.path $input_path \
  9. --angel.workergroup.number $workerNumber \
  10. --angel.worker.memory.gb $workerMemory \
  11. --angel.ps.number $PSNumber \
  12. --angel.ps.memory.gb $PSMemory \
  13. --angel.task.data.storage.level $storageLevel \
  14. --angel.task.memorystorage.max.gb $taskMemory

注: 与其它算法的不同在于模型类使用的是:“com.tencent.angel.ml.core.graphsubmit.GraphModel”

所有用Json定义的算法匀用这个模型类.