在线性模型中输出等于输入的加权和。
当输出为所有输入的加权和,则这时候的模型是线性的
线性模型-全连接神经网络
在线性可分问题中,线性模型能够很好的解决
现实中绝大多数问题不能通过线性分割
激活函数去实现非线性化
如果每个神经元的输出通过一个非线性函数,整个神经网络就是非线性的,这个非线性函数就是激活函数
加入偏置项,并进行非线性变换。
这里是加上偏置项和ReLU函数
tensorflow提供了其中非线性激活函数,用代码实现激活函数的前行传播算法
a=tf.nn.relu(tf.matmul(x,x1)+biases1)
y=tf.nn.relu(tf.matmul(a,x2)+biases2)
多层网络解决异或运算
解决多层变换,感知机模型(图4.5),并不能解决异或问题
加入隐藏层就能解决异或问题,神经网路实际上有组合特征提取的功能,对图像识别和语音识别由很大的帮助
损失函数的定义
神经网络的模型的效果和优化的目标是通过损失函数定义的
分类问题:将不同的样本分到事先定义好的类别中。
通过神经网络模型 解决多分类问题最常用的方法是设置n个输出节点,n为类别的个数。
神经网络可以得到一个n维的数组,数组中每一个维度对应一个类别,在理想情况下,以识别数字1为例,输出结果越接近【0,1,0,0,0,0,0,0,0,0,0】越好!
交叉熵(cross_entropy)用来衡量输出向量与期望向量之间的差距。交叉熵刻画了两个概率分布之间的距离,是比较常用的损失函数
交叉熵是两个概率分布之间的距离,但是神经网络的输出不一定是一个概率分布,通过加入softmax回归层将神经网络向前传播的结果变成概率分布
交叉熵的函数是不对称的,交叉熵刻画了两个概率分布的距离,交叉熵越小,两个概率越接近
p代表正确答案,q代表预测值
使用tensorflow实现交叉熵
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
y_真实值,y预测结果,tf.clip_by_value()将张量的log进行限制,不会出现不符合公式的计算结果,y的概率大于1的被换成了1,概率小于1e-10的被换成了1e-10
注意两个矩阵直接通过“*”不是矩阵相乘 tf.matmul 而是直接的元素相乘
实现softmax回归之后的交叉熵损失函数
cross_entropy=tf.nn.softmax_cross_entropy_with_logits(y,y_)
y代表输出结果,y_代表标准答案
回归问题解决的是具体数值的预测,房价的预测,销售的预测,这些问题的预测都是具体的实数
解决回归问题的输出一般只有一个节点,这个节点就是预测值
回归问题常用的损失函数 均方误差(MSE)
mse=tf..reduce_mean(tf.square(y_-y))
自定义损失函数
对于不同情况的损失函数不同
定义损失函数tf.select()实现选择操作,tf.greater()实现比较
注意tf.select 变成了tf.where
神经网络算法的优化:
梯度下降算法:优化单个参数的取值
反向传播算法:在所有参数上使用梯度下降算法
梯度下降算法会迭代式更新参数
其实就是每次对参数求梯度,并定义学习率来定义更新参数的幅度
但是梯度下降法也具有缺陷,参数的初始值会很大程度上影响到最后的结果
为了解决梯度下降法运算时间长,且出现局部最优的问题
每次计算一小部分训练数据的损失函数,一小部分(batch),
神经网络的大致一下过程