1.从数据中学习
线性可分问题可以通过有限次的学习进行解决,非线性可分问题无法通过自动学习来解决。
1.1数据驱动
深 度 学 习 有 时 也 称 为 端 到 端 机 器 学 习
1.2训练数据与测试数据
分为训练数据与测试数据是为了评价模型的泛化能力, 训练数据(监督数据)。
过拟合
欠拟合
2.损失函数
2.1均方误差
import numpy as mp
def mean_squared_error(y,t):
return 0.5*np.sum((y-t)**2)
t=[0,1,0,2,3]
y=[0,1,0,2,3]
print(mean_squared_error(np.array(y),np.array(t)))
2.2交叉熵误差
tk中只有正确解标签的索引为1,其他均为0(one-hot表示)。
import numpy as np
def cross_entropy_error(y,t):
delta=1e-7
return -np.sum(t*np.log(y+delta))
t=[0,0,0,1,0,0,0]
y=[0.1,0.05,0.1,0.05,0.1,0.1,0.1]
print(cross_entropy_error(np.array(y),np.array(t)))
函数内部在计算np.log时,加上了一个微小值delta。这是因为,当出现np.log(0)时,np.log(0)会变为负无限大的-inf,这样一来就会导致后续计算无法进行。作为保护性对策,添加一个微小值可以防止负无限大的发生。
2.3mini-batch学习
前面的损失函数都是针对单个数据进行的,如果是多个数据可以写成上面的一个形式。
其实只是把求单个数据的损失函数的式扩大到了N份数据,不过最后还要除以N进行正规化。通过除以N,可以求单个数据的“平均损失函数”。通过这样的平均化,可以获得和训练数据的数量无关的统一指标。
3.数值微分
3.1计算导数时候的差分
(x+h) (x-h)
中心差分
x (x+h)
前向差分
def numerical_difff(f,x):
h=1e-4
return f(x+h)-f(x-h)/2*h
def numerical_diff(f,x):
h=1e-4
return f(x+h)-f(x)/h
4.梯度
import numpy as np
def ff(x):
return x[0]**2+x[1]**2
def numerical_gradient(f,x):
h=1e-4
grad=np.zeros_like(x)
for idx in range(x.size):
tmp_val=x[idx]
x[idx]=tmp_val+h
fxh1=f(x)
x[idx]=tmp_val-h
fxh2=f(x)
print(fxh2)
grad[idx]=(fxh1-fxh2)/2*h
x[idx]=tmp_val
return grad
print(numerical_gradient(ff,np.array([0.1,0.01])))
1.梯度法
学习高原
极小值, 鞍点 :梯度为0,但不是最小值
梯度法公式
其中n,表示更新量,在神经网络学习中,称为学习率。像这样的参数被称为超参数,这种参数一般是人工设定的。
用python实现梯度下降法
def gradient_descent(f,init_x,lr=0.01,step_num=100):
x=init_x
# x是指参数向量
for i in range(step_num):
grad=numerical_gradient(f,x)
x-=lr*grad
#迭代更新参数向量,当偏导数为正的时候减,偏导数为负的时候 加上他的绝对值。
return x
4.2随机梯度下降法
由一个叫SGD的函数来实现,
主要步骤:
- mini-batch
- 计算梯度
- 更新参数
- 重复 1-3
关于epoch