15

机器学习必备加速技巧-向量化

 4 years ago
source link: https://www.tuicool.com/articles/BNBvMrI
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

机器学习需要训练大量的数据才能训练出模型, 如何加速训练过程是一个必须要考虑的问题, 所谓向量化, 直白点说就是采用矩阵乘法的形式来代替for循环累加, 下面我们举一个例子来演示一下

一个例子

问题: 如果给你一个给你 1000000 个数据 a1~a1000000,以及 1000000 个数据 b1~b1000000,要你求每一对 ai 和 bi 相乘的结果的总和c,你会怎幺做?

采用for循环累加的代码如下

j6byaaj.jpg!web

计算结果:249879.05298545936, for 循环计算耗时:519.999980927ms

如果采用numpy来进行同等的操作(向量化)

qQzqMza.jpg!web

计算结果:249879.05298545936, 矩阵计算耗时:0.999927520752ms

这计算速度的差距比马里亚纳海沟还深, 之所以差距会这幺大, 是因为numpy, matlab这类矩阵运算的程序, 充分利用了现代CPU的SIMD技术, 极大提高了运算效率

向量化在LR中的应用

现在我们拿最简单的LR逻辑回归来讲一下, 如何使用向量化的技巧, 手动训练模型

假如我们选用 BGD(批量梯度下降) 或者 MBGD(小批量梯度下降), 那幺LR的参数训练公式为

RVRjmyY.jpg!web

可以看到, 上述推导的公式中,中间的那个大矩阵, 其实就是输入数据矩阵的转置,这样代码实现就很简单了, 使用numpy实现的LR算法为

def grand_ascent(data_train, data_label):
    dataMatrix = np.mat(data_train)
    labelMat = np.mat(data_label).transpose()
    m, n = np.shape(dataMatrix)
    weights = np.ones((n, 1))
    alpha = 0.001
    
    for i in range(0, 500):
        h = sigmoid(dataMatrix * weights)
        weights = weights + alpha * dataMatrix.transpose() * (labelMat - h)        
    return weights

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK