Python深度学习 基于Tensorflow: Theano基础 读书笔记

未来补充

逻辑回归实例

拟合函数

f ( x ) = 1 1 + e x ∗ w − b f(x) = \frac{1}{1 + e^{x * w - b}} f(x)=1+exwb1

代价函数

x e n t ( w , b ) = − y ∗ l o g ( f ( x ) ) − ( 1 − y ) ∗ l o g ( 1 − f ( x ) ) xent(w, b) = -y * log(f(x)) - (1 - y) * log(1 - f(x)) xent(w,b)=ylog(f(x))(1y)log(1f(x))
c o s t ( w , b ) = x e n d . m e a n ( ) + 0.01 ∗ ( w 2 ) . s u m ( ) cost(w, b) = xend.mean() + 0.01 * (w^2).sum() cost(w,b)=xend.mean()+0.01(w2).sum()

import theano
from theano import tensor as T
import numpy as np

rng = np.random
# 为了测试,自己生成10个样本,每个样本是3维的向量,然后用于训练
N = 10
feats = 3
D = (rng.randn(N, feats).astype(np.float32), rng.randint(size=N, low=0, high=2).astype(np.float32))
print(D)

# 声明自变量x、以及每个样本对应的标签y(训练标签)
x = T.matrix("x")
y = T.vector("y")

# 随机初始化参数w、b=0,为共享变量
w = theano.shared(rng.randn(feats), name="w")
b = theano.shared(0., name="b")

# 构造代价函数
p_1 = 1 / (1 + T.exp(-T.dot(x, w) - b)) # sigmoid激活函数
xent = -y * T.log(p_1) - (1 - y) * T.log(1 - p_1) # 交叉熵代价函数
cost = xent.mean() + 0.01 * (w ** 2).sum() # 代价函数的平均值+L2正则项以防过拟合,其中权重衰减系数为0.01

gw, gb = T.grad(cost, [w, b]) # 对总代价函数求参数的偏导数

prediction = p_1 > 0.5 # 大于0.5的预测值为1,否则为0

# 训练所需函数
train = theano.function(inputs=[x, y], outputs=[prediction, p_1, cost, xent], updates=((w, w - 0.2 * gw), (b, b - 0.2 * gb)))

# 训练
training_steps = 1000
for i in range(training_steps):
    print("argument w: ", w.get_value())
    print("bias b=: ", b.get_value())
    pred, p, c, err = train(D[0], D[1])
    print("prediction: ", pred, ", p_1: ", p, ", cost: ", c, ", err:", err.mean()) # 查看代价函数下降变化过程
x = [ 0.42029333, -1.5406104 , -1.3815119 ],
       [-0.81724215,  2.692577  , -1.1432962 ],
       [ 1.4458053 ,  0.9359624 , -0.94535774],
       [-0.77486396,  2.5584276 , -0.19896454],
       [-0.6860778 , -0.7624264 ,  0.95979226],
       [ 0.38952217,  0.19767062, -0.8868365 ],
       [ 0.23906663, -0.08130413,  1.7912796 ],
       [ 0.698266  ,  2.1277857 , -0.25860745],
       [-0.62304705, -0.04989657, -0.5194475 ],
       [ 0.01967213, -0.36104852,  0.64915204]
y = [1., 0., 1., 1., 1., 0., 1., 1., 0., 0.]

argument w:  [1.07340157 0.14980592 0.69294124]
bias b=:  0.5080448351832716
prediction:  [False False  True False  True  True  True  True False  True] , p_1:  [0.44302089 0.31906819 0.82420632 0.48043537 0.57992647 0.58449296
 0.8801373  0.80172645 0.37094702 0.71603904] , cost:  0.5784541620173481 , err: 0.5619061590139924

这其中有几个概念点

  • 交叉熵代价函数
  • 过拟合
  • 权重衰减系数
  • L2正则项

交叉熵代价函数

接触较少,未来更新
首先给香农上柱香,香农属于老天爷喂饭吃的。信息熵公式如下:
S = − ∑ i P i log ⁡ P i S = -\sum_{i} P_i \log P_i S=iPilogPi

在《深度学习的数学》中介绍线性回归中,代价函数是

C k = 1 2 { y k − ( p x k + q ) } 2   C T = C 1 + C 2 + . . . + C 7 C_k = \frac{1}{2} \{{y_k - (px_k + q)}\}^2 \\\ C_T = C_1 + C_2 + ... + C_7 Ck=21{yk(pxk+q)}2 CT=C1+C2+...+C7

代价函数用于模拟预测值真实值的差距,

凸凹函数

凸函数,对其定义域 C C C上的任意两点 x 1 x_1 x1 x 2 x_2 x2,总有

f ( x 1 + x 2 2 ) ≤ f ( x 1 ) + f ( x 2 ) 2 f(\frac {x_1 + x_2 }{2}) \le \frac {f(x_1) + f(x_2)}{2} f(2x1+x2)2f(x1)+f(x2)

严格凸函数,

f ( x 1 + x 2 2 ) < f ( x 1 ) + f ( x 2 ) 2 f(\frac {x_1 + x_2 }{2}) \lt \frac {f(x_1) + f(x_2)}{2} f(2x1+x2)<2f(x1)+f(x2)

对应于凹函数,则有

f ( x 1 + x 2 2 ) ≥ f ( x 1 ) + f ( x 2 ) 2 f(\frac {x_1 + x_2 }{2}) \ge \frac {f(x_1) + f(x_2)}{2} f(2x1+x2)2f(x1)+f(x2)

过拟合

Python深度学习 基于Tensorflow: Theano基础 读书笔记_第1张图片
注:上图来源于欠拟合、过拟合及如何防止过拟合

L2正则化

L2正则化通常被称为权重衰减(weight decay),就是在原始的损失函数后面再加上一个L2正则化项,即全部权重[公式]的平方和,再乘以λ/2n。- 欠拟合、过拟合及如何防止过拟合
L2正则化起到使得权重参数 [公式] 变小的效果,为什么能防止过拟合呢?因为更小的权重参数 [公式] 意味着模型的复杂度更低,对训练数据的拟合刚刚好,不会过分拟合训练数据,从而提高模型的泛化能力 - 欠拟合、过拟合及如何防止过拟合
Python深度学习 基于Tensorflow: Theano基础 读书笔记_第2张图片

你可能感兴趣的:(读书笔记)