1. 神经网络解决问题的基本步骤
基本步骤列举如下:
- 提取问题中实体的特征向量作为神经网络的输入(特征工程)。
- 定义神经网络的结构,及如何从输入得到输出(前向传播算法)。
- 通过训练数据调整神经网络中参数的取值(优化算法)。
- 利用训练好的神经网络预测未知的数据(在未知数据上使用前向传播算法)。
1.1 前向传播算法
1.1.1 所需信息
- 神经网络的输入。
- 神经网络的连接结构。
- 每个神经元中的参数。
对于一个没有激活函数的三层(输入层、一个隐藏层、输出层)的简单神经网络而言:
前向传播过程则为:
#第一层的结果为 input 点乘【输入层到隐藏层的参数 weights1】
layer1=tf.matmul(input,weights1)
#输出层的结果为 layer1 点乘【隐藏层到输出层的参数weights2】
output_value=tf.matmul(layer1,weights2)
由于线性模型的任意组合仍然为线性模型,因此该简单神经网络等价于:
output_value=tf.matmul(input,tf.matmul(weights1,weights2))
#==output_value=tf.matmul(input,weights3)
因此需要去线性,才可以使隐藏层有意义,进而解决线性不可分问题。
去线性需要激活函数。
1.1.2 激活函数及偏置项
对每个节点的输出在加权和的基础上做一个非线性变换。
可用的非线性变换主要有三:
- relu:f(x)=max(x, 0)
- sigmoid:f(x)=1/(1+e^(-x))
- tanh:f(x)=(1-e^(-2x))/(1+e ^(-2x))
对于一个激活函数为 relu 的三层(输入层、一个隐藏层、输出层)的简单神经网络而言,前向传播过程则为:
#第一层的结果为 input 点乘【输入层到隐藏层的参数 weights1】
layer1=tf.nn.relu(tf.matmul(input,weights1)+biases1)
#输出层的结果为 layer1 点乘【隐藏层到输出层的参数weights2】
output_value=tf.nn.relu(tf.matmul(layer1,weights2)+biases2)
1.1.3 多分类问题的网络结构
- 对于多分类问题,通常为设置 n 个输出节点,得到一个 n 维数组作为输出结果。其中 n 为类别的个数。
- 可利用Softmax回归将神经网络的输出变为一个概率分布。
Softmax(y)=e^ y/(add_all(e^y))
1.1.4 回归问题的网络结构
回归问题需要预测出一个任意实数,因此只有一个输出节点。该输出节点的输出值即为预测值。
1.2 优化算法
优化的思想为寻找一组参数,使得损失函数最小化。
1.2.1 损失函数
(1)分类问题的损失函数
使用交叉熵函数。交叉熵刻画两个概率分布之间的距离,表示通过概率分布 q (predicted) 表达概率分布 p (true) 的难度。可求出Softmax回归后得到的输出 Softmax(