深度学习
文章目录
什么是深度学习
深度学习是一个复杂的机器学习算法,它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据
深度学习和机器学习的区别
神经网络(ANN)
什么是神经网络
神经网络可以分为生物神经网络和人工神经网络,人工神经网络是模仿生物神经网络设计的,一般分为三层:分别是输入曾输出层和隐藏层
隐藏层是计算机模拟人脑的过程
生物神经网络
生物神经网络(Biological Neural Networks)一般指生物的大脑神经元,细胞,触点等组成的网络,用于产生生物的意识,帮助生物进行思考和行动
人工神经网络
人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。
人工神经网络的特点
- 具有自我学习功能
- 具有联想存储功能
- 具有高速寻找优化解的能力
人工神经网络的优势
人工神经网络完成非常轻松得完成下面5类功能
- 模式分类
- 聚类
- 回归与拟合
- 优化计算
- 数据压缩
人工神经网络分类
根据拓扑结构分为向前网络和反馈网络
- 向前网络是网络中各个神经元接收前一级的输入,并输出到下一级,没有反馈,可以用一个有向无环路图表示,例如:感知器、BP神经网络
- 反馈网络是网络内神经元间的反馈,这种神经网络的信息处理是状态的变换,可以用一个无向的完备图表示,例如:BAM双向联想记忆网络
感知器
感知器是人工神经网络中的一种典型结构,它的主要的特点是结构简单,对所能解决的问题 存在着收敛算法,并能从数学上严格证明,从而对神经网络研究起了重要的推动作用。
单层感知器
输入和输出端之间没有隐藏层,只能分类简单线性可分的模型(比如二分类),只能画出一条直线
常见于非线性决策边界
多层感知器
输入和输出端之间多了隐藏层
可以实现非线性分类,并且可以画多条直线
感知器优缺点
优点
模型简单,易于实现
缺点
无法完美得处理线程不可分得训练数据
最终结果受训练集的数据影响很大
激活函数
实现神经元输入和输出的非线性化。加入非线性因素,可以画曲线
常见激活函数
BP反向传播神经网络
用于对神经网络进行优化,对超参数的部分进行模拟,直到修正到完美的参数
比如:真实值是100 预测值是101,算超参数,进行修正,直到预测值变成100
常用梯度下降法
梯度下降法
梯度下降法是一种求解局部函数极小值点迭代优化算法
给定一个点、计算当前的导数,沿着导数正负反向取值,得到新的点,最后重复之前的步骤,不断重复,直到满足最终条件
构建一个简单的神经网络
你已经学会了上面的理论,现在来构建一个最简单的神经网络来预测D要不要去爬山吧!
目标
根据A、B、C、D的爬山数据,预测D去不去爬山
背景
A、B、C、D经常一起去爬山
用1表示去爬山 0表示没去爬山
前5次数据是
A B C D
0 1 0 1
1 1 0 1
1 0 1 0
0 0 1 0
0 1 1 1
需要预测的数据:
A B C D
0 1 0 ?
创建数据
引入库
import numpy as np
前五次数据可以用矩阵进行表示
ABC去爬山的数据可以作为输入
X = np.array([[0,1,0],[1,1,0],[1,0,1],[0,0,1],[0,1,1]])
D的数据可以作为输出
Y = np.array([[1],[1],[0],[0],[1]])
初始化假设
用随机数做假设,假设D去不去爬山和ABC去不去爬山之间相关系数的权重为weights
np.random.seed(1)
weights = 2 * np.random.random((3,1))-1
输入神经元进行计算
假设weights算出的值接近0,表示D不去爬山的可能性大,反之接近1则去爬山的可能性大
使用前五次D、的数据Y - 利用假设关系得到的output数值 最后得到误差error
通过不断循环调整假设关系weights,减少误差,最终得到误差最小的一组关系系数weights
for it in range(100000):
output = 1/(1+np.exp(-np.dot(X,weights)))
error = Y - output
delta = error * output *(1-output)
weights += np.dot(X.T,delta)
输出运行结果
print("误差为:\n",error)
print("相关系数为:\n",weights)
probability = 1/(1+np.exp(-np.dot([[0,1,0]],weights)))
print("D去爬山的概率为:\n",probability)
可以看到D去爬山的概率为0.999
完整代码
import numpy as np
# 创建数据
X = np.array([[0,1,0],[1,1,0],[1,0,1],[0,0,1],[0,1,1]])
Y = np.array([[1],[1],[0],[0],[1]])
# 初始化假设
np.random.seed(1)
weights = 2 * np.random.random((3,1))-1
# 输入神经元进行计算
for it in range(100000):
output = 1/(1+np.exp(-np.dot(X,weights)))
error = Y - output
delta = error * output *(1-output)
weights += np.dot(X.T,delta)
# 输出运行结果
print("误差为:\n",error)
print("相关系数为:\n",weights)
probability = 1/(1+np.exp(-np.dot([[0,1,0]],weights)))
print("D去爬山的概率为:\n",probability)