博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
机器学习笔记(1):深度学习基本概念简介
阅读量:2079 次
发布时间:2019-04-29

本文共 3356 字,大约阅读时间需要 11 分钟。

机器学习笔记(1):深度学习基本概念简介

注:下文的多数图片和所有数据均来自李弘毅老师的PPT。

在李宏毅老师最新的机器学习课程中,以一种极为精彩的方式从机器学习引入了深度学习,并且相当生动地解释了神经网络可以拟合任意曲线的原因,让我受益良多。于是,就有了这篇博客。

机器学习模型训练的大致流程如下图所示,总共分为三个步骤:

  1. 选择一个合适的带有未知参数的函数(或模型);
  2. 定义一个损失函数,如MSE,若输出是概率,那么也可能是Cross-Entropy;
  3. 选择一种优化器,通过训练数据来优化函数的参数。

在这里插入图片描述

关于后两步的内容,从机器学习到深度学习,事实上并没有什么本质的变化。因此,本文主要会聚焦在模型的变化上。下面会通过一个例子来介绍选择模型的变化过程,这个例子也是李老师在课上讲的例子,即YouTube上的每日流量预测。

1.线性模型

假设我们没有什么先验知识,对流量预测没什么了解,我们选择了一个最简单的只有一个输入的线性模型来预测下一天的流量。模型如下:

y = b + w x (1) y=b+wx \tag1 y=b+wx(1)
其中,x表示上一天的流量,y表示下一天的预测流量。通过这个模型,我们就可以简单的预测未来一天的每日流量,当然预测结果不会很精确。

在这里插入图片描述

上图是模型(1)训练后得到的最佳模型的预测结果(红线表示真实数据,蓝线表示预测数据),可以发现模型基本上就是把上一天的数据当作了下一天的预测数据了。

根据真实数据,我们可以发现数据具有很强的周期性,大致是7天一循环,那么如果我们把前7天的数据当作输入,预测结果会不会更好呢?更近一步,也许可以选择更多的天数作为输入,如此预测的精度会不会更好呢?新的线性模型如下:

y = b + ∑ j = 1 n w j x j (2) y=b+\sum_{j=1}^n w_jx_j \tag2 y=b+j=1nwjxj(2)

输入变量个数(n) 2017-2020(训练数据) 2021(测试数据)
n=1 0.48k 0.58k
n=7 0.38k 0.49k
n=28 0.33k 0.46k
n=56 0.32k 0.46k

上表就是分别选择前1天、前7天、前28天和前56天作为输入的模型的预测损失。可以发现前3个模型在随着输入变量的增加,损失值越来越小。但当预测天数增加到56天后,损失值就不再变化了,这说明已经很难再通过这种方式提升预测精度了。

2.神经网络和深度学习

为什么线性模型不能再提升预测精度呢?原因很简单,这是因为线性模型太过简单。因为无论如何修改权重w和偏置b,线性模型都只是一条直线。对于那些不是直线的数据,线性模型的预测必然会存在 “model bias”,如下图的折线图。

在这里插入图片描述

那么该如何拟合这种曲线呢?是否存在一种可以拟合任意曲线的模型呢?

答案当然是存在的。存在一种函数,我们只需要对其进行简单的组合,就可以拟合任意的曲线。这个函数就是hard-sigmoid函数,如下图的橙色曲线所示。其通用公式可以表示为:

h − s i g m o i d ( x ) = c max ⁡ ( 0 , min ⁡ ( 1 , b + w x ) ) (3) h-sigmoid(x)=c\max(0,\min(1,b+wx)) \tag3 hsigmoid(x)=cmax(0,min(1,b+wx))(3)
顺便一提,下图的蓝色曲线表示的是sigmoid函数,可以视为hard-sigmoid函数的一种近似。其通用公式可以表示为:
s i g m o i d ( x ) = c 1 1 + e − ( b + w x ) = c    σ ( b + w x ) (4) sigmoid(x)=c\frac{1}{1+e^{-(b+wx)}}=c \; \sigma(b+wx) \tag4 sigmoid(x)=c1+e(b+wx)1=cσ(b+wx)(4)
在这里插入图片描述

如下图所示,我们只需要把4条具有不同参数的hard-sigmoid函数进行相加,就可以完全拟合下图的红色折线。

在这里插入图片描述

当折线变为曲线时,也可以通过上述方式进行拟合,只不过会需要更多的hard-sigmoid函数而已,如下图所示。
在这里插入图片描述

需要注意的是,由于hard-sigmoid函数的表示形式比较复杂,通常我们会使用sigmoid函数来近似。因此,下文使用的都是sigmoid函数

由此,我们就有了一个具有强大拟合能力的函数,只要用的sigmoid函数足够多,理论上就可以拟合任意的曲线。其表达形式如下:

y = b + ∑ i m c i    σ ( b i + ∑ j = 1 n w i j x j ) (5) y=b+\sum_i^m c_i \; \sigma(b_i+\sum_{j=1}^n w_{ij}x_j) \tag5 y=b+imciσ(bi+j=1nwijxj)(5)
其中, σ \sigma σ表示sigmoid函数

上式本质上就是多个sigmoid函数的组合相加,而这也正是神经网络的数学形式。接下来,我们就来谈谈如何将上述公式转换为一个单层神经网络(one layer)

假设有三个输入变量 ( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3),我们需要3个sigmoid函数去拟合一条曲线。那么根据公式(5),我们可以得到下式:

y = b + ∑ i 3 c i    σ ( b i + ∑ j = 1 3 w i j x j ) (5) y=b+\sum_i^3 c_i \; \sigma(b_i+\sum_{j=1}^3 w_{ij}x_j) \tag5 y=b+i3ciσ(bi+j=13wijxj)(5)
在这里插入图片描述

对于公式(5),将其转换为一个单层神经网络就是如上图的结构。观察上图,我们可以发现:

  • sigmoid函数的个数就是隐藏层的神经元的个数;
  • c i c_i ci就是从隐藏层到输出层的权重,b就是从隐藏层到输出层的偏置。

接下来,我们就用神经网络模型来预测每日流量,看看预测精度是否有提升。预测网络使用的激活函数是ReLU函数,其功能与sigmoid函数相同。

ReLU个数(n) 2017-2020(训练数据) 2021(测试数据)
线性模型 0.32k 0.46k
n=10 0.32k 0.45k
n=100 0.28k 0.43k
n=1000 0.27k 0.43k

可以发现,随着ReLU个数的提升,模型的预测精度也在提高。但同样当个数达到一定数量后,提升也会逐渐减少甚至停止。

除了增加隐藏层神经元个数外,我们还可以通过增加网络层数的方式进一步提升模型的预测精度。而这种具有多层的神经网络,也就是所谓的深度学习(deep learning)

网络层数 2017-2020(训练数据) 2021(测试数据)
1 layer 0.28k 0.43k
2 layer 0.18k 0.39k
3 layer 0.14k 0.38k
4 layer 0.10k 0.44k

可以发现,随着网络层数的增加,模型预测精度也会增加。但当层数增加到4层后,可以发现模型对于未知数据的预测精度反而下降了,这说明此时模型已经出现过拟合(Overfitting)

3.问题

上文我们知道了通过增加神经元个数和网络层数,可以提高模型的预测精度。关于前者,上文做出了解释,本质上增加神经元个数就是在增加sigmoid函数的个数,而组合任意个sigmoid函数就可以逼近任意曲线,这也就是神经网络可以拟合任意曲线的根本原因。

数,可以提高模型的预测精度。关于前者,上文做出了解释,本质上增加神经元个数就是在增加sigmoid函数的个数,而组合任意个sigmoid函数就可以逼近任意曲线,这也就是神经网络可以拟合任意曲线的根本原因。

但是后者该如何解释呢?既然组合任意多个sigmoid函数就可以逼近任意曲线,那么理论上我们只需要一层网络就可以实现,只需要根据情况增加神经元个数即可。那么为什么不去增加神经元个数,反而要增加网络层数呢?为什么增加网络层数也可以提高模型的预测能力呢?

转载地址:http://usuqf.baihongyu.com/

你可能感兴趣的文章
解决activemq多消费者并发处理
查看>>
UDP连接和TCP连接的异同
查看>>
hibernate 时间段查询
查看>>
java操作cookie 实现两周内自动登录
查看>>
Tomcat 7优化前及优化后的性能对比
查看>>
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>