深度学习公式 向量化

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战


Σ( ° △ °|||)︴开局先来说几句废话。作为一个生物学的学生(当年所有专业选的都是计算机,结果被迫学生物了),无奈只好自学。我是用C++作为入门语言的,刚开始学数据结构的时候,因为是自学,很痛苦,我每天都在吐槽:有STL为什么还要自己写啊!!!后来学会了嘛,为了练练手,所以经常刷题的时候自己写一些甚至库函数已经有的功能来实现。那时在我眼里就是条条大路通罗马,反正都能得到同样的结果。虽然学了算法的时间复杂度啊怎么样的我也没太放入实际中考虑,毕竟平时刷题遇到的测试数据没那么大量。

后来一个学长跟我说,你可以闲着没事去看看库函数源代码是什么。比如人家的排序可能是好几种排序的组合体,都是各种大佬研究优化出来的算法。

言归正传

对于我们深度学习中一些公式也是如此,如果可以简化,可以用语言内置的线性代数的库那就再好不过了。

用内置算法的好处:

  • 速度更快
  • 用更少代码实现
  • 相比于你自己写的更不易出错
  • 更好地配合硬件系统

举个简单栗子:

hθ(x)=j=0nθjxjh_{\theta}(x)=\sum_{j=0}^{n} \theta_{j} x_{j}

可以将其看做是θTx\theta^{T} x而进行计算,这样就转化为两个向量θ=[θ0θ1θ2...]x=[x0x1x2...]\theta=\left[\begin{array}{l}\theta_{0} \\ \theta_{1} \\ \theta_{2} \\ … \end{array}\right] \quad x=\left[\begin{array}{l}x_{0} \\ x_{1} \\ x_{2} \\ …\end{array}\right]的乘积了。

octave:

Unvectorized implementation

就是声明两个向量,遍历。

% 没有向量化代码如下:
prediction =0.0for j = 1:n+l
    prediction = prediction + theta(j) * x(j)
end
复制代码

Vectorized implementation

% 向量化之后代码如下:
prediction= theta' * x; % 英文单引号 ' 表示求矩阵或向量的转置。忘记的回去看octave语法
复制代码

C++:

Unvectorized implementation

double prediction = 0.0; 
for(int j = 0; j<=n; j++)
{
    prediction += theta[j]*x[j];
}
复制代码

Vectorized implementation

double prediction = theta.transpose()*x;
复制代码

再来个栗子:

θj:=θjα1mi=1m(hθ(x(i))y(i))xj(i) for all j\begin{array}{l} \theta_{j}:=\theta_{j}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)} \end{array} \text{ for all j}

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享