作业三


深度学习Warm up:单层神经网络及深度学习框架雏形

作业模版参考答案

截止时间:2018.12.20 23:59:59

需要的知识

  • 理解梯度下降法
  • 矩阵的导数计算
  • 一些matlab编程

你需要

在作业模版的基础上,根据自己的兴趣完成任务表中三项,并让demo部分能够(直接或间接)调用你所实现的代码。(你可能会根据需要写1-3个demo)

任务表:

  • 网络层
    • 线性函数: 添加偏置项,即将W' * x改为W' * x + b
    • 激活函数: tanh
    • 激活函数: relu
      深度学习中的默认激活函数
    • 损失函数: mae(mean-absolute-error)
    • (BONUS) 算法加速: 重写backwardLoss,将for循环去掉.
      这需要你对向量化有所了解
  • 优化算法
    • 梯度裁剪(gradient clipping)
    • (BONUS) minibatch SGD;BatchSize应该作为参数trainingOptions
      该方法能够在不损失训练效果的前提下使得大规模数据集的训练成为可能(减少内存使用量及计算量)
    • 带动量的随机梯度下降sgdm (SGD with momentum)
      深度学习中的默认的优化器之一,
    • ADAM
      深度学习中的默认优化器之一(实际调试网络比sgdm方便)参考文档
    • Adagrad
      用的不如sgdm与adam广泛,参考文档
    • RMSprop
      同上
  • 数据集
    • (BONUS) 写一个iris数据集的读取函数
      深度学习中大概有1/3的工作是在数据集的处理上
    • (BONUS) 训练iris数据集
      既然写好了那就试着顺便训练一下看看吧

提交方式

  1. hw3.m中用x来标记你完成的工作,这对于代码检查是有帮助的,例如完成了前三项则标记如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    % Todo List
    % * Network layer
    % - [x] activation function: tanh
    % - [x] activation function: relu
    % - [x] loss function: mae(mean-absolute-error)
    % compared with mse(mean-squared-error), it takes 1-norm instead of 2-norm
    % - [] (BONUS) accelaration: rewrite the for-loop using matrix operation in @backwardLoss
    % This requires some knowledge on vectorization, see
    % <https://www.mathworks.com/help/matlab/matlab_prog/vectorization.html>
  2. 在demo的描述部分填写该demo测试的工作,例如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    %%%%% BEGIN of demo 1 %%%%%
    %----- BEGIN of Description -----%
    % This demo tests:
    % - activation function: tanh
    % - loss function: mae
    %----- END of Description -----%

    [X,Y] = readData('toy');
    ...
    %%%%% END of demo 1 %%%%%

    %%%%% BEGIN of demo 2 %%%%%
    %----- BEGIN of Description -----%
    % This demo tests:
    % - activation function: relu
    % - loss function: mae
    %----- END of Description -----%

    [X,Y] = readData('toy');
    ...
    %%%%% END of demo 2 %%%%%
  1. 将你修改好的hw3.m复制到服务器上的~/Homework/hw3/hw3.m

评分:

  • 总分:15 + 5 bonus
  • 得分 = min(6*n, 15) + min(2*m, 5)

其中

  • n 为你完成的任务数目
  • m 为你完成的任务中带BONUS标记的数目
  • bonus分数不计算在预定的100分总分中,最终成绩会单独加上

评价标准:

  • 以demo代码可运行为最低要求
    • 没被demo覆盖的工作会酌情减分或视作未完成
    • 错误的代码实现会酌情减分或视作未完成
  • 根据需要修改模版代码是完全接受的
    • 你做的不合理修改越多,阅读起来就越困难
    • 阅读起来越不耐心,减分的可能性就越高
    • 不合理修改大概包括:代码风格不一致、代码结构/命名/框架无理由地大规模变动
  • 仅接受一份hw3.m,例如:若你想同时实现tanhrelu这两个激活函数,请以一种兼容的方式写在同一个hw3.m文件里

关于作业模版的一些解释

  • 在波士顿房价预测(推导示例代码)中,我们用线性与梯度下降方法来拟合数据,本次作业仅仅只是将模型改为线性+sigmoid,方法依然还是梯度下降法

  • 为了构建一个可扩展的神经网络框架,这里将梯度下降法拆解成四部分内容(推导及解释):

    1. 权重初始化 –> initializeNetwork
    2. 计算函数值 –> forward (实际使用的是forwardLoss)
    3. 利用函数值计算梯度 –> backwardLoss
    4. 利用梯度更新参数 –> update
  • 看不懂模版的可能原因: