# 《深度学习从0开始》

## 1.感知机

o

=

σ

(

<

w

,

x

>

+

b

)

o = sigma(<w,x> + b)

o=σ(<w,x>+b) (<w,x> 表示向量wx做内积）

σ

(

x

)

=

{

1

i

f

x

>

0

1

o

t

h

e

r

w

i

s

e

sigma(x)=left{ begin{matrix} 1 & if x>0 \ -1 & otherwise end{matrix} right.

σ(x)={11ifx>0otherwise
（是个二分类问题）

### 训练感知机

initialize w=0 and b = 0
repeat #每次拿1个sample来优化
if

y

i

[

<

w

,

x

i

>

+

b

]

0

y_i[<w,x_i> + b] leqslant 0

yi[<w,xi>+b]0 then

w

w

+

y

i

x

i

w leftarrow w + y_ix_i

ww+yixi and

b

b

+

y

i

b leftarrow b + y_i

bb+yi
end if
until all classified correctly

l

(

y

,

x

,

w

)

=

m

a

x

(

0

,

y

<

w

,

x

>

)

l(y,x,w) = max(0, -y<w,x>)

l(y,x,w)=max(0,y<w,x>)

## 2. 多层感知机:最简单的深度网络

x

R

n

x in R^n

xRn

W

1

R

m

×

n

W_1 in R^{m times n}

W1Rm×n,

b

1

R

m

b_1 in R^m

b1Rm

w

2

R

m

,

b

2

R

w_2 in R^m, b_2 in R

w2Rm,b2R

h

=

σ

(

W

1

x

+

b

1

)

h = sigma(W_1x + b_1)

h=σ(W1x+b1) # h是向量

o

=

w

2

T

h

+

b

2

o = w_2^Th + b_2

o=w2Th+b2 #o是标量

σ

sigma

σ 是按元素的激活函数 #激活函数必须是非线性的，否则再多层也是线性模型

Tanh, ReLU(x)=max(x,0)

y

1

,

y

2

,

.

.

.

y

k

=

s

o

f

t

m

a

x

(

o

1

,

o

2

,

.

.

.

,

o

k

)

y_1, y_2, ...y_k = softmax(o_1,o_2,...,o_k)

y1,y2,...yk=softmax(o1,o2,...,ok), 把所有o拉到[0,1]使得加起来=1

-多分类

x

R

n

x in R^n

xRn

W

1

R

m

×

n

,

b

1

R

m

W_1 in R^{m times n}, b_1 in R^m

W1Rm×n,b1Rm

W

2

R

m

×

k

,

b

2

R

k

W_2 in R^{m times k}, b_2 in R^k

W2Rm×k,b2Rk

h

=

σ

(

W

1

x

+

b

1

)

h = sigma(W_1x + b_1)

h=σ(W1x+b1)

o

=

W

2

T

h

+

b

2

o = W_2^Th + b_2

o=W2Th+b2

y

=

s

o

f

t

m

a

x

(

o

)

y = softmax(o)

y=softmax(o) # h、o、y都是向量

h

1

=

σ

(

W

1

x

+

b

1

)

h_1 = sigma(W_1x + b_1)

h1=σ(W1x+b1)

h

2

=

σ

(

W

2

h

1

+

b

2

)

h_2 = sigma(W_2h_1 + b_2)

h2=σ(W2h1+b2)

h

3

=

σ

(

W

3

h

2

+

b

3

)

h_3 = sigma(W_3h_2 + b_3)

h3=σ(W3h2+b3)

o

=

W

4

h

3

+

b

4

o = W_4h_3 + b_4

o=W4h3+b4 #o是向量

#打开visdom: 在【Pytorch】环境下 python -m visdom.server

## 3.模型选择、欠拟合和过拟合

1）解决训练数据稀缺的方法：
K折交叉验证：原始训练数据被分成K个不重叠的子集。然后进行K次模型训练和验证，每次在K - 1 个子集上进行训练，并在剩余的子集上进行验证。最后，通过对K次实验的结果取平局来估计训练和验证误差。
2）欠拟合和过拟合

• 训练误差和验证误差都很严重，但它们之间仅有一点差距→欠拟合：可以用更复杂的模型减低训练误差
• 训练误差明显低于验证误差时 →过拟合：通常更关心验证误差，而不是训练误差和验证误差之间的差距

### a.权重衰减=L2正则化

f

(

x

)

=

w

T

x

f(x) =w^Tx

f(x)=wTx, wx均为向量

L

(

w

,

b

)

=

1

n

i

=

1

n

1

2

(

w

T

x

(

i

)

+

b

y

(

i

)

)

2

L(w,b) = frac{1}{n} sum_{i=1}^{n}frac{1}{2}(w^Tx^{(i)} + b - y^{(i)})^2

L(w,b)=n1i=1n21(wTx(i)+by(i))2
w, b)是权重和偏置参数

||w|| = ||w||_2(L2范数），

λ

>

0

lambda > 0

λ>0

L

(

w

,

b

)

+

λ

2

w

2

L(w,b) + frac{ lambda}{2}||w||^2

L(w,b)+2λ∣∣w2
L2正则化回归的小批量随机梯度下降更新如下式：

w

(

1

η

λ

)

w

η

B

i

B

x

(

i

)

(

w

T

x

(

i

)

+

b

y

(

i

)

)

w leftarrow (1 - eta lambda)w - frac{eta}{|B|}sum_{i in B}x^{(i)}(w^Tx^{(i)} + b - y^{(i)})

w(1ηλ)wBηiBx(i)(wTx(i)+by(i))

λ

lambda

λ对应于较小约束的w, 而较大的

λ

lambda

λw的约束更大

### b.暂退法（Dropout)

h

=

{

0

p

h

1

p

h' = left{begin{matrix} 0 & 概率为p \ frac{h}{1-p} & 其他情况 end{matrix}right.

h={01ph概率为p其他情况

E

[

h

]

=

h

E[h'] = h

E[h]=h
Dropout 代码见D:MLProjects107Dropout

## 4.前向传播、反向传播和计算图

### 1）前向传播（forward propagation)

(例如Fashion-mnist上的MLP）

x

R

d

x in R^d

xRd, 并且隐藏层不包括偏置项；

z

=

W

(

1

)

x

z = W^{(1)}x

z=W(1)x , 其中

W

(

1

)

R

h

×

d

W^{(1)} in R^{h times d}

W(1)Rh×d是隐藏层的权重参数。

z

R

h

z in R^h

zRh

h

=

ϕ

(

z

)

h = phi(z)

h=ϕ(z)

o

=

W

(

2

)

h

o = W^{(2)}h

o=W(2)h,

W

(

2

)

R

q

×

h

,

o

R

q

W^{(2)} in R^{q times h}, o in R^q

W(2)Rq×h,oRq

L

=

l

(

o

,

y

)

L = l(o, y)

L=l(o,y)

L

2

L_2

L2正则化的定义， 给定超参数

λ

lambda

λ, 正则化项为：

s

=

λ

2

(

W

(

1

)

F

2

+

W

(

2

)

F

2

)

s = frac{lambda}{2}(||W^{(1)}||_F^2 + ||W^{(2)}||_F^2)

s=2λ(∣∣W(1)F2+∣∣W(2)F2)

L

2

L_2

L2范数。

J

=

L

+

s

J = L+s

J=L+s

J

J

J称为目标函数

### 2）反向传播（backward propagation)

Y = f (X), Z = g(Y)

Z

X

=

p

r

o

d

(

Z

Y

,

Y

X

)

frac{partial Z}{partial X} = prod(frac{partial Z}{partial Y},frac{partial Y}{partial X})

XZ=prod(YZ,XY)
prod运算符:执行必要的操作（如换位和交换位置）后将其参数相乘。

J

/

W

(

1

)

partial J / partial W^{(1)}

J/W(1)

J

/

W

(

2

)

partial J / partial W^{(2)}

J/W(2)

• 计算目标函数J = L + s相对于损失项L和正则项s的梯度

J

L

=

1

,

J

s

=

1

frac{partial J}{partial L}=1,frac{partial J}{partial s}=1

LJ=1,sJ=1

• 根据链式法则计算J关于输出层变量o的梯度：

J

o

=

p

r

o

d

(

J

L

,

L

o

)

=

L

o

R

q

frac{partial J}{partial o} = prod(frac{partial J}{partial L},frac{partial L}{partial o}) = frac{partial L}{partial o} in R^q

• 计算正则项相对于两个参数的梯度：

s

W

(

1

)

=

λ

W

(

1

)

frac{partial s}{partial W^{(1)}} = lambda W^{(1)}

W(1)s=λW(1)

s

W

(

2

)

=

λ

W

(

2

)

frac{partial s}{partial W^{(2)}} = lambda W^{(2)}

W(2)s=λW(2)

• 现在可以计算最接近输出层的模型参数的梯度

J

W

(

2

)

R

q

×

h

frac{partial J}{partial W^{(2)}} in R^{q times h}

W(2)JRq×h.使用链式法则得出：

J

W

(

2

)

=

p

r

o

d

(

J

o

,

o

W

(

2

)

)

+

p

r

o

d

(

J

s

,

s

W

(

2

)

)

=

J

o

h

T

+

λ

W

(

2

)

frac{partial J}{partial W^{(2)}}=prod(frac{partial J}{partial o}, frac{partial o}{partial W^{(2)}}) + prod(frac{partial J}{partial s}, frac{partial s}{partial W^{(2)}}) = frac{partial J}{partial o}h^T + lambda W^{(2)}

W(2)J=prod(oJ,W(2)o)+prod(sJ,W(2)s)=oJhT+λW(2)

• 为了获得关于

W

(

1

)

W^{(1)}

W(1)的梯度，我们需要继续沿着输出层到隐藏层反向传播。关于隐藏层输出的梯度

J

h

R

h

frac{partial J}{partial h} in R^h

hJRh由下式给出：

J

h

=

p

r

o

d

(

J

o

,

o

h

)

=

W

(

2

)

T

J

o

frac{partial J}{partial h} = prod(frac{partial J}{partial o}, frac{partial o}{partial h}) = {W^{(2)}}^Tfrac{partial J}{partial o}

hJ=prod(oJ,ho)=W(2)ToJ

• 由于激活函数

ϕ

phi

ϕ是按元素计算的，计算中间变量

z

z

z的梯度

J

/

z

R

h

partial J/ partial z in R^h

J/zRh 需要使用按元素乘法运算符，用

bigodot

表示：

J

z

=

p

r

o

d

(

J

h

,

h

z

)

=

J

h

ϕ

(

z

)

frac{partial J}{partial z} = prod(frac{partial J}{partial h}, frac{partial h}{partial z}) = frac{partial J}{partial h}bigodotphi'(z)

zJ=prod(hJ,zh)=hJϕ(z)

• 最后得到最接近输入层的模型参数的梯度

J

/

W

(

1

)

R

h

×

d

partial J / partial W^{(1)} in R^{h times d}

J/W(1)Rh×d，根据链式法则，得：

J

W

(

1

)

=

p

r

o

d

(

J

z

,

z

W

(

1

)

)

+

p

r

o

d

(

J

s

,

s

W

(

1

)

)

=

J

z

x

T

+

λ

W

(

1

)

frac{partial J}{partial W^{(1)}} = prod(frac{partial J}{partial z},frac{partial z}{partial W^{(1)}}) +prod(frac{partial J}{partial s},frac{partial s}{partial W^{(1)}}) = frac{partial J}{partial z}x^T + lambda W^{(1)}

W(1)J=prod(zJ,W(1)z)+prod(sJ,W(1)s)=zJxT+λW(1)

h

(

l

)

=

f

l

(

h

(

l

1

)

)

h^{(l)} = f_l(h^{(l-1)})

h(l)=fl(h(l1)),因此

o

=

f

L

.

.

.

f

1

(

x

)

o= f_L circ...circ f_1(x)

o=fL...f1(x).
o关于任何一组参数

W

(

l

)

W^{(l)}

W(l)的梯度写为下式：

W

(

l

)

o

=

h

(

L

1

)

h

(

L

)

.

.

.

h

(

l

)

h

(

l

+

1

)

w

(

l

)

h

(

l

)

partial _{W^{(l)}}o = partial_{h^{(L-1)}}h^{(L)}...partial_{h^{(l)}}h^{(l+1)}partial_{w^{(l)}}h^{(l)}

W(l)o=h(L1)h(L)...h(l)h(l+1)w(l)h(l)

M

(

L

)

.

.

.

M

(

l

+

1

)

M^{(L)}... M^{(l + 1)}

M(L)...M(l+1) 与梯度向量

v

(

l

)

v^{(l)}

v(l)的乘积

## 5.环境和分布偏移

P

(

A

B

)

=

P

(

A

B

)

P

(

B

)

P(A|B) = frac{P(AB)}{P(B)}

P(AB)=P(B)P(AB)
“A在B发生的条件下”发生的概率

P

(

A

B

)

P(A|B)

P(AB)
A,B同时发生的概率，联合概率

P

(

A

B

)

=

P

(

A

,

B

)

=

P

(

A

B

)

P(AB)=P(A,B)=P(Acap B)

P(AB)=P(A,B)=P(AB)

1)协变量偏移

2)标签偏移（label shift)

3）概念偏移（concept shift)

{

(

x

1

,

y

1

)

,

.

.

.

,

(

x

n

,

y

n

)

}

{(x_1,y_1), ...,(x_n, y_n)}

{(x1,y1),...,(xn,yn)},在每一个小批量之后更新模型f的参数（不考虑正则化）：

1

n

i

=

1

n

l

(

f

(

x

i

)

,

y

i

)

(经验风险)

frac{1}{n}sum_{i=1}^nl(f(x_i), y_i) tag{经验风险}

n1i=1nl(f(xi),yi)(经验风险)

E

p

(

x

,

y

)

[

l

(

f

(

x

)

,

y

)

]

=

l

(

f

(

x

)

,

y

)

p

(

x

,

y

)

d

x

d

y

(真实风险)

E_{p(x,y)}[l(f(x),y)] = iint l(f(x),y)p(x,y) dxdy tag{真实风险}

Ep(x,y)[l(f(x),y)]=l(f(x),y)p(x,y)dxdy(真实风险)

m

i

n

i

m

i

z

e

1

n

i

=

1

n

β

i

l

(

f

(

x

i

)

,

y

i

)

([1])

minimize frac{1}{n}sum_{i=1}^nbeta_il(f(x_i),y_i) tag{[1]}

minimizen1i=1nβil(f(xi),yi)([1])

{

(

x

i

,

y

1

)

,

.

.

.

,

(

x

n

,

y

n

)

}

{(x_i,y_1),...,(x_n,y_n)}

{(xi,y1),...,(xn,yn)} 和一个未标记的测试集

{

u

1

,

.

.

.

,

u

m

}

{u_1, ...,u_m}

{u1,...,um}。对于协变量偏移，我们假设1<= i <=n的

x

i

x_i

xi来自某个源分布，

u

i

u_i

ui来自目标分布。
1.生成一个二元分类训练集：

{

(

x

1

,

1

)

,

.

.

.

,

(

x

n

,

1

)

,

(

u

1

,

1

)

,

.

.

.

,

(

u

m

,

1

)

}

{(x_1, -1), ..., (x_n,-1), (u_1,1),...,( u_m, 1)}

{(x1,1),...,(xn,1),(u1,1),...,(um,1)}
2.用对数几率回归训练二元分类器得到函数h。
3.使用

β

i

=

e

x

p

(

h

(

x

i

)

)

beta_i = exp(h(x_i))

βi=exp(h(xi))或更好的

β

i

=

m

i

n

(

e

x

p

(

h

(

x

i

)

)

,

c

)

beta_i =min(exp(h(x_i)),c)

βi=min(exp(h(xi)),c)(c为常量）对训练数据进行加权。
4.使用权重

β

i

beta_i

βi进行([1])中

{

(

x

i

,

y

1

)

,

.

.

.

,

(

x

n

,

y

n

)

}

{(x_i,y_1),...,(x_n,y_n)}

{(xi,y1),...,(xn,yn)}的训练。

q

(

y

)

p

(

y

)

q(y) neq p(y)

q(y)=p(y), 但类别条件分布保持不变

q

(

x

y

)

=

p

(

x

y

)

q(x|y) = p(x|y)

q(xy)=p(xy)

l

(

f

(

x

)

,

y

)

p

(

x

y

)

p

(

y

)

d

x

d

y

=

l

(

f

(

x

)

,

y

)

q

(

x

y

)

q

(

y

)

p

(

y

)

q

(

y

)

d

x

d

y

iint l(f(x),y)p(x|y)p(y)dxdy = iint l(f(x),y)q(x|y)q(y)frac{p(y)}{q(y)}dxdy

l(f(x),y)p(xy)p(y)dxdy=l(f(x),y)q(xy)q(y)q(y)p(y)dxdy

β

i

=

p

(

y

i

)

q

(

y

i

)

beta_i = frac{p(y_i)}{q(y_i)}

βi=q(yi)p(yi)
1.采用现成发分类器（基于训练数据训练的）并使用验证集（也来自训练分布）计算其混淆矩阵C：k

×

times

× k 矩阵，列对于于标签类别，行对于于模型的预测类别，每个单元格的值

c

i

j

c_{ij}

cij是验证集中，真实标签为j,而模型预测为i的样本数量所占的比例。
2.所有模型在测试时的预测取平均数，得到平均模型输出

μ

(

y

^

)

R

k

mu (hat y) in R^k

μ(y^)Rk
3.

p

(

y

)

=

C

1

μ

(

y

^

)

p(y) = C^{-1}mu (hat y)

p(y)=C1μ(y^)
4.观测源数据上的标签，很容易计算估计分布q(y)。
5.计算权重

β

i

beta_i

βi,并将其代入([1])中。

eg.由于环境的磨损，交通摄像头的箭头会逐渐退化，影响摄像头的图像质量；

1）批量学习：batch learning
2)在线学习 online learning：

m

o

d

e

l

:

f

t

d

a

t

a

:

x

t

e

s

t

i

m

a

t

e

:

f

t

(

x

t

)

o

b

s

e

r

v

a

t

i

o

n

:

y

t

model: f_t →data: x_t →estimate: f_t(x_t) →observation: y_t

model:ftdata:xtestimate:ft(xt)observation:yt

l

o

s

s

l

(

y

t

,

f

t

(

x

t

)

)

loss ：l(y_t,f_t(x_t))

lossl(yt,ft(xt))

m

o

d

e

l

:

f

t

+

1

model: f_{t+1}

model:ft+1

3）老虎机bandits
4)控制
5）强化学习 reinforcement learning

Kaggle 房价预测：代码见D:MLProjects116HousePricePrediction
K折交叉验证与超参数搜索

2. 降低模型方差，从而提高模型的泛化能力。

GridSearch + CV: 网格搜索和交叉验证

Grid Search: 一种调参手段；穷举搜索：在所有候选的参数选择中，通过循环遍历，尝试每一种可能性，表现最好的参数就是最终的结果。其原理就像在数组里找打最大值。缺点：耗时！

2. RandomizedSearchCV(随机搜索）

THE END

)">