线性回归
Model
对一条数据,然后相应的weight , bias是标量。预测值,一般为了方便,把x第一个位置增加一个1,然后b个w组合成一个d+1的向量,这样模型可以简写成。
对于条样本数据,的矩阵,然后,输出是一个N行1列的预测值,和实际值之间做最小二乘得到loss function 。
为了误差最小,线性模型是凸模型,只有一个全局最优,可以直接,得到关于的方程,然后可以利用矩阵理论专栏里矩阵广义逆部分的介绍,得到最小二乘近似解。
当很大时,这个方法不work,所以使用梯度下降,即。
分析
误差来源: bias与variance,一般来说简单的模型由于受到不同数据的影响小,所以variance小,但是由于包含的可能集合更小,所以bias可能会更大。
如果误差主要来源是bias ,model可能根本就不包含真正的目标,那就是underfitting,redesign the model
如果是variance大,那就是overfitting,more data/正则化
技巧
- 1 引入高阶项
- 2 分析种类,不同种类使用不同的参数,
- 3 归一化/标准化 feature scaling 如果不同的属性分布空间差距太大了,应该调整到差不多的空间。这样可以让loss对于不同的属性敏感程度相同,在梯度下降的时候更容易走向谷
- 4 正则化项: 惩罚过大的参数,因为小参数面对输入改变的时候不敏感,从图像上表现为更平滑。正则化项不需要加入b,因为这个是保证平滑性,b只是调整位置
- 5 训练技巧:多个模型先用train + validation,选择最好的模型,把train + validation一起训练,可能得到更好的结果
- 6 learning rate的设置,画出loss随着update的变化,一条指数衰减的曲线说明合适
梯度下降得不到最优解的原因
- 局部最优、鞍点、在有些地方已经很慢了,于是停止了。
- 为什么会使loss升高,因为梯度只描述了每个轴的方向,在复合方向上未必减小 为什么是梯度,Taylor级数,线性主部,邻域最优
代码
手写梯度下降模板
def full_data_gradient_descent(data, labels, current_weights, current_bias, learning_rate):
# if the loss function is sum 1/2 * 1/n * (y-y*)^2, then the gradient will be D^T(Dw-y) / n
# where, D = [1, data], w = [current_bias, current_weights]^T, y = labels
n = data.shape[0]
D = np.concatenate((np.ones(n).reshape(n, 1), data), axis=1)
w = np.concatenate((current_bias, current_weights))
gradient = np.matmul(D.T, (np.matmul(D, w) - labels)) / n
new_weights = current_weights - learning_rate * gradient[1:]
new_bias = current_bias - learning_rate * gradient[0]
return new_weights, new_bias