01 回归分析

125 阅读2分钟

线性回归

Model

对一条数据xRdx\in R^d,然后相应的weight wRdw\in R^d, bias是标量。预测值y=xTw+by=x^T w+b,一般为了方便,把x第一个位置增加一个1,然后b个w组合成一个d+1的向量,这样模型可以简写成y=xTwy=x^Tw

对于NN条样本数据,XRN×D+1X\in R^{N\times D+1}的矩阵,然后y=Xwy=Xw,输出是一个N行1列的预测值,和实际值之间做最小二乘得到loss function L(w)=12N(Xwy)T(Xwy)L(w)=\frac{1}{2N} (Xw-y)^T(Xw-y)

为了误差最小,线性模型是凸模型,只有一个全局最优,可以直接L/w=0\partial L/\partial w=0,得到关于ww的方程1NXT(Xwy)=0\frac{1}{N}X^T(Xw-y)=0,然后可以利用矩阵理论专栏里矩阵广义逆部分的介绍,得到最小二乘近似解。

NN很大时,这个方法不work,所以使用梯度下降,即ww+αL/ww\leftarrow w+\alpha \partial L/\partial w

分析

误差来源: bias与variance,一般来说简单的模型由于受到不同数据的影响小,所以variance小,但是由于包含的可能集合更小,所以bias可能会更大。

如果误差主要来源是bias ,model可能根本就不包含真正的目标,那就是underfitting,redesign the model

如果是variance大,那就是overfitting,more data/正则化

技巧

  • 1 引入高阶项
  • 2 分析种类,不同种类使用不同的参数,
  • 3 归一化/标准化 feature scaling 如果不同的属性分布空间差距太大了,应该调整到差不多的空间。这样可以让loss对于不同的属性敏感程度相同,在梯度下降的时候更容易走向谷
  • 4 正则化项:λ(wi)2\lambda \sum(w_i)^2 惩罚过大的参数,因为小参数面对输入改变的时候不敏感,从图像上表现为更平滑。正则化项不需要加入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