当我们训练神经网络时,我们通常使用梯度下降,这依赖于连续的,可微分的实值成本函数。最终成本函数可能会产生均方误差。或者换种说法,梯度下降隐式地认为最终目标是回归 -最大限度地减少实值误差度量。
有时,我们希望神经网络要做的就是执行分类 -给定输入,将其分类为两个或多个离散类别。在这种情况下,用户关心的最终目标是分类准确性-正确分类的案例的百分比。
但是,当我们使用神经网络进行分类时,尽管我们的目标是分类准确度,但这并不是神经网络试图优化的目标。神经网络仍在尝试优化实值成本函数。有时这些指向同一方向,但有时却不同。特别是,我一直在遇到这样的情况:经过训练以正确最小化成本函数的神经网络具有比简单的手工编码阈值比较差的分类精度。
我已经使用TensorFlow将其简化为一个最小的测试用例。它建立一个感知器(无隐藏层的神经网络),在绝对最小的数据集(一个输入变量,一个二进制输出变量)上训练它,评估结果的分类精度,然后将其与简单手的分类精度进行比较编码的阈值比较;结果分别是60%和80%。直观地讲,这是因为具有大输入值的单个离群值会产生相应的大输出值,因此,将成本函数最小化的方法是,在对两种以上普通情况进行错误分类的过程中,要尽最大努力适应这种情况。感知器正确地执行了被告知要执行的操作;只是这与我们实际想要的分类器不符。
我们如何训练神经网络,使其最终最大化分类精度?
import numpy as np
import tensorflow as tf
sess = tf.InteractiveSession()
tf.set_random_seed(1)
# Parameters
epochs = 10000
learning_rate = 0.01
# Data
train_X = [
[0],
[0],
[2],
[2],
[9],
]
train_Y = [
0,
0,
1,
1,
0,
]
rows = np.shape(train_X)[0]
cols = np.shape(train_X)[1]
# Inputs and outputs
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# Weights
W = tf.Variable(tf.random_normal([cols]))
b = tf.Variable(tf.random_normal([]))
# Model
pred …
Run Code Online (Sandbox Code Playgroud) classification machine-learning neural-network gradient-descent loss-function