TensorFlow损失函数
目的是找到使损失最小化的系数
声明一个损失函数需要将系数定义为变量,将数据集定义为占位符。可以有一个常学习率或变化的学习率和正则化常数。
设 m 是样本数量,n 是特征数量,P 是类别数量。应该在代码之前定义这些全局参数:
m=1000
n=15
P=2
在标准线性回归的情况下,只有一个输入变量和一个输出变量:
#训练数据的占位符
X=tf.placeholder(tf.float32,name='X')
Y=tf.placeholder(tf.float32,name='Y')
#变量初始化为0
w0=tf.Variable(0.0)
w1=tf.Variable(0.0)
#线性回归模型
Y_hat=X*w1+w0
#损失函数
loss=tf.square(Y-Y_hat,name='loss')
在多元线性回归的情况下,输入变量不止一个,而输出变量仍为一个。现在可以定义占位符X的大小为 [m,n],其中 m 是样本数量,n 是特征数量,代码如下:
#训练数据的占位符
X=tf.placeholder(tf.float32,name='X',shape=[m,n])
Y=tf.placeholder(tf.float32,name='Y')
#变量初始化为0
w0=tf.Variable(0.0)
w1=tf.Variable(tf.random_normal([n,1]))
#线性回归模型
Y_hat=tf.matmul(X,w1)+w0
#损失函数
loss=tf.reduce_mean(tf.square(Y-Y_hat,name='loss'))
逻辑回归的情况下,损失函数定义为交叉熵。输出 Y 的维数等于训练数据集中类别的数量,其中 P 为类别数量:
#训练数据的占位符
X=tf.placeholder(tf.float32,name='X',shape=[m,n])
Y=tf.placeholder(tf.float32,name='Y',shape=[m,p])
#变量初始化为0
w0=tf.Variable(0tf.zeros([1,P]),name='bias')
w1=tf.Variable(tf.random_normal([n,1]),name='weights')
#线性回归模型
Y_hat=tf.matmul(X,w1)+w0
#损失函数
entropy=tf.nn.softmax_cross_entropy_with_logits(Y_hat,Y)
loss=tf.reduce_mean(entropy)
若想把 L1 正则化加到损失上,那么:
lamda=tf.constant(0.8) #正则化参数
regularization_param=lamda*tf.reduce_sum(tf.abs(w1))
#新损失
loss+=regularization_param
对于== L2 正则化==
lamda=tf.constant(0.8) #正则化参数
regularization_param=lamda*tf.nn.12_loss(w1)
#新损失
loss+=regularization_param
- 为确保收敛,损失函数应为凸的。一个光滑的、可微分的凸损失函数可以提供更好的收敛性。随着学习的进行,损失函数的值应该下降,并最终变得稳定。