1. Introduction
- 机器学习的目的:寻找一个函数,对于给定的输入,这个函数可以输出相应结果。
例如:一段语音输入,输出识别出的语言、一张图片输入,输出目标种类、“围棋”状态输入,得到下一步落子位置。
- 根据不同的功能,可以将函数大致分为以下几类:
- 回归问题(Regression): 输出是一个标量(scalar)
- 分类问题(Classification):给定相应输出选项(classes),输出正确的类型
- 结构化学习(Structured Learning):创造有结构的相应输出(图像、文件)
实例
-
如何找到这个函数呢?
老师给我们以一个例子作为示范:预测Youtube上次日的流量
- 首先以当日流量作为自变量
x
x
x,次日流量作为预测目标
y
y
y
流程如下:建立模型、定义损失函数、优化模型
-
建立模型:确定函数的结构、参数个数(weight/bias),需要相关domain knowledge以及一定的研究经验,这里我们先从最简单的线性函数: y = b + w 1 x y = b + w_1x y=b+w1x,其中 x x x是已知的特征feature; w w w是权重weight, b b b是偏置量bias, w w w和 b b b为未知量,需要从数据中学习得到。
-
定义损失函数:损失函数是一个关于模型参数的的函数 L ( b , w ) L(b,w) L(b,w),他代表着预测值与标签值label的偏差量,越小说明模型与训练集的预测结果越接近。常用的 l o s s loss loss函数有MAE和MSE等。
-
优化模型:在做完一次训练后,我们要找到使得loss更小的模型参数,因此需要优化更新模型的参数。
我们使用梯度下降法(Gradient Descent)进行优化,- 对于一个参数
w
w
w:
- 首先随机选择一组参数 w 0 w_0 w0,
- 计算出对应的损失函数 l o s s loss loss对于 w w w的梯度,
- 根据设定的学习率(learning rate)与梯度相乘作为步长,更新后 w w w
- 迭代多次更新 w w w(结束条件:梯度趋于0或达到迭代次数)
- 对于两个参数
w
w
w和
b
b
b:
与一个参数类似,只是微分变为偏微分,梯度下降时同时更新两个参数。
- 对于一个参数
w
w
w:
-
测试:将输入结果与测试数据进行对比
通过对比发现,数据有明显的周期性,因此修改 F u t u r e Future Future为前 j j j日的数据,这样模型的参数量也会随之增加。
-
- 令
j
j
j =1、7、28、56,分别进行训练测试后,我们发现随着自变量的增加,预测效果变好的速度慢慢变慢。
- 线性函数变为神经网络
通过画出函数图像,我们可以发现线性的模型过于simple,不论如何调整参数都无法很好的拟合。
我们需要一种更为有弹性flexible的模型,这种模型本身的问题称为model bias。
如下图,这时我们可以用很多条蓝线相加的结果sum来拟合
通过极限的思想,对于任何一个分段线性函数Piecewise linear curve,甚至是非线性函数,都可以用足够数量的蓝线之和进行拟合。
这种蓝线(hard sigmoid)可以用sigmoid这个函数近似表示
这样我们只需要改变相应的 c c c、 w w w、 b b b就可以改变sigmoid的形状
这样,我们就得到了用多个 s i g m o i d sigmoid sigmoid函数进行拟合的最终模型
新的模型相比之前的模型,具有了更多的参数
利用线性代数的知识,我们可以将函数用矩阵的形式表现出来
将 r r r代入 s i g m o i d sigmoid sigmoid,得到下一步的数值
最后,我们就得到了模型的结构,以及相关的未知参数
对于大多数的网络,我们也会使用 R u L U RuLU RuLU来代替 S i g m o i d Sigmoid Sigmoid作为激活函数
而如果将一层神经网络的输出再作为神经网络的输入代入,那么就构成了多层的神经网络,即深度学习
在实际的运行过程中,不会一次运行所有数据,而会用batch:将整个数据分成很多batch,每次运行一个batch,update一次参数;将所有batch运行完一次,是为一个epoch。
batch size也是一个需要设置的超参。
- 首先以当日流量作为自变量
x
x
x,次日流量作为预测目标
y
y
y
2. Colab使用与上传结果
Google Colab,全名Colaboratory,是由谷歌提供的免费的云平台,可以使用keras、tensorflow等框架进行深度学习。最近Colab平台已经将K80 GPU更换成Tesla T4 GPU,提供了更强的算力,可以完美“薅谷歌的羊毛”。对于刚入门机器学习或深度学习的用户,这个平台是不二之选。Colab网页链接放在这里
- 首先,使用这个平台是需要科学上网的,所以如果无法科学上网的同学可以在本地使用jupyter或者pycharm等方法做
- 使用这个平台需要有一个google账号,登入后界面如下
在文件这里可以选择文件,以及上传到云端、Github,下载到本地等操作
在这里选择连接服务器后,可以使用GPU/TPU能够提升训练网络的速度,在菜单栏点击修改-笔记本设置即可改变硬件配置,一般选择GPU模式。
- 在主界面新建代码块输入如下指令便可查询显卡信息
!nvidia-smi
- 导入数据有三种办法:
- 直接上传文件
- 上传到Google Drive并导入
- 从github下载
第一种方法对于较大的文件,很容易出现断开连接,上传失败的情况。
一般建议用第二种方法,使用如下代码挂载Google Drive读取数据,这样不会存在数据丢失的情况。
代码运行后在下方会出现链接,点击链接登录会出现验证码,复制粘贴到方框内便能在文件目录下挂载Google Drive文件夹,读取数据。
from google.colab import drive
drive.mount('/content/gdrive')
!ls
优点:白嫖、对买不起GPU的学生党来说是重大福音、显卡对比前一代K80有较大提升
缺点:连接不稳定,断开就重跑GG,如果想要在CV/NLP领域做科研发好的论文显然性能是不够的,建议配好的服务器或者到极客云/阿里云/腾讯云租界云服务器。
常用命令行
ls : List all files in the current directory
ls -l : List all files in the current directory with more detail
pwd : Output the working directory
mkdir : Create a directory named
cd : Move to directory named
gdown : Download files from google drive
wget : Download files from the internet
python <python_file> : Executes a python file
3. Pytorch
参考文档Deep Learning with PyTorch: A 60 Minute Blitz
4. HW1
代码已上传Github:菜鸡初学者的机器学习