提高神经学习的学习效率
并行计算
可以使用GPU进行并行计算,以此提高学习效率。
梯度消失问题
梯度消失问题的存在使得学习效率会变慢,出现梯度消失的原因如下:
其中,对sigmoid函数求导的时候,在[-4, 4]的范围外会发生导数很小,接近于0的情况,进而导致学习的梯度消失。
改进的思路
归一化
因为数据度量的量纲可能不同,所以需要对数据进行归一化处理。
归一化的效果如图:
参数初始化问题
上图的参数初始化方法是业界比较认可的一种初始化方式。
参数初始化的代码如下:
def default_weight_initializer(self):
# 初始化每层的偏置
self.biases = [np.random.randn(y, 1) for y in self.sizes[1:]]
# 初始化每层的权重
self.weights = [np.random.randn(y, x)/np.sqrt(x) for x, y in zip(self.sizes[:-1], self.sizes[1:])]
正则化
L1正则化:
L1正则化项的导数:
L2正则化:
L2正则化项的导数:
代码需要修改如下:
self.weights = [(1-eta*(lmbda/n))*w - (eta / len(mini_batch)) * nw for w, nw in zip(self.weights, nabla_w)]
学习率
交叉熵
交叉熵定义
交叉熵求导
交叉熵代码:
class CrossEntropyCost(object):
'''
a = np.array([[np.nan, np.inf],
[-np.nan, -np.inf]])
np.nan_to_sum(a)
array([[0.00000000e+000, 1.79769313e+308],
[0.00000000e+000, -1.79769313e+308]])
'''
@staticmethod
def fn(a, y):
return np.sum(np.nan_to_num(-y * np.log(a) - (1-y) * np.log(1-a)))
@staticmethod
def delta(z, a, y):
return (a-y)
模型的保存与加载
模型保存与加载代码如下:
# 保存模型
def save(self, filename):
data = {
"sizes": self.sizes,
"weights": [w.tolist() for w in self.weights],
"biases": [b.tolist() for b in self.biases],
"cost": str(self.cost.__name__)
}
f =