机器学习、深度学习基本概念简介及Pytorch教学

1.机器学习任务

机器学习任务不只是有回归问题和分类问题,还有结构化学习
Structured Learning — create something with structure(image,document),即文本生成、图像生成

2.Loss

1.平均绝对误差-Mean Absolute Error—MAE

image.png
image.png

2.均方误差-Mean Square Error-MSE-用于线性回归

image.png
image.png

3.均方根误差-Root Mean Square Error-MSE-用于线性回归

image.png

4.交叉熵-Cross-entropy-用于分类

当y和y_pred都是概率分布值的话,会选用交叉熵。

3.Sigmoid激活函数的引入

红色曲线可以看做是一个常数项加上一大堆的蓝色的Function。
常数项设置的值,就是红色线跟y轴的交点。
image.png
线0 + 线1 ,就能得到红色线第一段的函数。
image.png
线0 + 线1 + 线2, 就能得到红色线前两段的函数。
image.png
线0 + 线1 + 线2 + 线3 , 就能得到红色线函数。
image.png

经过上述举例,我们发现,无论是多么复杂的分段函数,都可以用一个常数项和一大堆不一定一样的Function组合而成。
同样的,这个理论也适用于曲线,当我们的点取得足够多,有更多的Function,就能很好的拟合曲线。(用分段函数逼近曲线,用Function构造分段函数☺)
image.png
image.png
问:而这些蓝色的Function怎么表示呢?
我们可以用Sigmoid函数去逼近它。
image.png
所以,任何的曲线,都可以用一堆sigmoid函数加一个常数项逼近。这就是,为什么在神经网络中,我们要使用sigmoid激活函数。即用一堆sigmoid函数逼近分段函数,用分段函数逼近曲线。
image.png

4.理解Sigmoid函数

由3可知,对于任意一条曲线,我们都可以通过如下函数进行拟合。其中sigmoid函数中的求和项的意思是不只一个特征。比如,今天的温度不仅受今天的影响,还和前面28天有关,那样的话, 我们就有28个特征。j就等于28。
image.png
image.png
这里,我们的未知参数包括,W、b、C以及b,第一个b是向量,第二个b是标量。
然后,我们可以将所有的这些参数竖着放,统称为θ。
image.png

5.ReLU与Hard Sigmoid

一个Hard Sigmoid 可以由两个ReLU来构成。
image.png
因为两个ReLU才相当于一个sigmoid,所以,原来使用sigmoid作为激活函数的拟合函数可以用双倍ReLU代替。
image.png

6.从单层到多层

image.png

7.Tensor(张量)

  • 是一个高维度的矩阵(array)

image.png
这里注意,如果是一个一维张量,它的shape应该是(x, ),只有一个数字。

  • 创建Tensor的方式

    • 从一个列表中创建、或从一个numpy数组中创建
      • x = torch.tensor([[1, -1], [2, 2]])
      • x = torch.from_numpy( np.array([[1, -1], [2, 2]]) )
    • 创建0矩阵
      • x = torch.zeros([2, 2])
    • 创建单位矩阵
      • x = torch.ones([1,2,3])

        1.squeeze(args)操作与unsqueeze(args)

        torch.squeeze(input, dim=None, , out=None) → Tensor
        如果输入的input的shape是(A×1×B×C×1×D) ,则输出格式为(A×B×C×D)。即去除(展开)所有维度为1的。
        *如果指定了dim,则当dim对应维度为 1时,才展开。

    squeeze(arg)表示第arg维的维度值为1,则去掉该维度。否则tensor不变。(即若tensor.shape()[arg] = 1,则去掉该维度)
    image.png
    unsqueeze(arg)与squeeze(arg)作用相反,表示在第arg维增加一个维度值为1的维度。
    image.png

    2.Tensor矩阵的转置-transpose()

    image.png

    3.Tensor矩阵的拼接-cat(list)

    image.png

4.计算梯度

变量后面一定要设置属性requires_grad=True

image.png

5.加载数据集-Dataset与DataLoader

具体可去之前记录的刘二大人的Pytorch深度学习实践课程笔记中查看。

6.定义一个神经网络

1.定义一个全连接网络 - torch.nn.Linear(in_features, out_features)
image.png
通过 对象.weight, 对象.bias查看参数
image.png

7.Loss函数

nn.MSELoss用于线性回归
nn.CrossEntropyLoss用于分类
image.png

8.optim函数

torch.optim.SGD(params, lr, momentum=0)

9.训练过程

image.pngimage.png

10.评估过程-验证集和测试集

image.png
image.png

8.神经网络的定义

我们可以通过torch.nn.Sequential()方法,将每一层要做的处理按顺序添加进去,封装成一个对象,然后在forward方法里直接调用这个对象即可。不用对每一层用到的模型逐个定义并赋给变量,然后再在forward里逐个调用变量。
image.png

9.深度学习简介

1.特征提取

隐藏层所做的工作就是不断地抽象出更高层的特征。可以把隐藏层当做特征提取器
image.png
从以前的人工设计一些特征提取器,到现在我们把所有的特征丢到DNN中,让它自己学习。
我们的问题从人工抽取特征转换成了要设计多少层神经网络以及每层神经网络有多少个神经元的问题


2.DNN应用领域及效果

DNN在语音识别和图像识别领域应用效果比较好,而在NLP领域的效果相对没有那么突出(可以理解为人在做NLP的任务时,人的水平是比较强的,如情感分析)。

3.FAQ

1.hidden layer 和hidden units怎么选?
根据经验
2.隐藏层的结构可以自动构造吗?
可以,如evolutionary artificial neural networks(进化人工神经网络),不过这个还是在探索阶段。
3.我们可以设计神经网络结构吗?即不用全连接神经网络
可以,如CNN

4.DNN的一些框架

pytorch、tensorflow、Caffe、CNTK。他们都可以帮助我们做反向传播的工作,所以,我们需要做的就是设计神经网络的结构。
image.png