算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week3

上一周的回顾

      过去的一周真的发生了很多意想不到、惊心动魄的事情,从大学四年最后一次体测到唐奖竞争,从小IG力挽狂澜到RNG遗憾折戟,生活可谓是充满了无数的可能。也正是因为这样,我们的生活才不至于那么乏味,像工厂流水线生产一样标准化、制度化,而随时都可能发生一段令人难忘的奇妙冒险。做学问、努力学习的过程其实也是这样,不仅要脚踏实地,还要学会正确处理遇到的一系列非预期范围内的问题。我越来越相信一句话:真正的大师常怀一颗学徒的心。保持谦逊低调,不骄不躁,才是大将之风。继续努力吧!

地洼下,水流之;人谦下,德归之。——魏征


Deeplearning.ai神经网络与深度学习(Week3)

1.1 向量化

      向量化是一种当采集的数据量特别大时,用来显著提高计算速度,节省计算时间的优化方法。当我们运用logistic回归对采集到的数据集进行计算时,如果我们在Python代码里显式的使用到for循环,当数据集并不是很大时,也许其运行速度还没什么毛病,一旦数据量增大,这将会带来非常大的计算效率方面的困扰。为了解决for循环带来的效率问题,聪明的人们发明了向量化这种聪明的方法进行优化。基本思路是:当我们需要将两组变量对应相乘时,我们可以将其作为两个矩阵进行矩阵之间的运算。这样就算不需要显式的写出for循环,我们一样可以得到精确的答案。为了证明向量化的高效,我们需要用Python代码进行验证:

import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

tic = time.time()
c = np.dot(a,b)
toc = time.time()

print(c)
print("Vectorized version:"+str(1000*(toc - tic))+"ms")

c = 0
tic = time.time()
for i in range(1000000):
    c += a[i]*b[i]
toc = time.time()

print(c)
print("for loop:"+str(1000*(toc - tic))+"ms")

      这个代码的功能是测试使用for循环和向量化两种方式对数据集进行操作时,两者计算效率之间的比较。运行结果如下:

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week3_第1张图片

      结果是显而易见的:使用for循环的计算时间是使用向量化的计算时间的500多倍!这个结果是惊人的,证明了向量化的高效。如果说在机器学习、深度学习发展的初期,我们会惊艳于向量化这种优化方式的高效,那么在深度学习飞速发展的今天,我们已经完全离不开它所提供的高效。数据的海量性、操作的复杂性使我们必须摒弃任何地方都使用for循环这种低效操作的习惯,并且不断去探究如何才能使我们的算法更加高效,这充满了挑战性,同时也充满了乐趣。

1.2 向量化Logistic Regression

      现在,有了向量化这个有力的武器,我们需要让它有用武之地,而目标就是logistic regression中的向量化应用。回顾logistic regression的步骤,我们可以发现,前后需要用到两次for循环,第一次是在对样本进行循环时,第二次是在对样本特征进行循环时:

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week3_第2张图片

      很明显,在对每一个样本的特征进行计算时,我们可以将w以及x看作两个矩阵在进行矩阵的乘法运算,用向量化的方法改写计算方式:

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week3_第3张图片

      将每一个样本的特征平铺在X矩阵中,那么最后的结果便可以改写为X矩阵与w矩阵转置相乘后再加上b矩阵。我们将两次for循环减少到了一次,当样本数量集很大时,这样的做法可以使我们的logistic regression效率大大提高。对于反向传播过程(即修正参数过程),也可以应用到:

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week3_第4张图片

      综上,我们再描述一次完整的向量化logistic regression过程:

算法工程师之路——Deeplearning.ai神经网络与深度学习篇Week3_第5张图片

      怎么样,是不是感觉在一次循环迭代中不用到任何for循环就可以完成计算很爽呢?
      接下来我们说说如何在实际生产中运用向量化的思想。其实很简单,Python爸爸已经有了一个非常强大的数据科学工具库Numpy,提供了大量高效的矩阵运算方法,使用起来也相当方便,比如我要创建一个维度为百万级别的随机数矩阵,只需要输入以下命令:

import numpy as np
a = np.random.rand(1000000)

      又比如,我想创建两个百万级别维度的随机数矩阵并将它们相乘:

a = np.random.rand(1000000)
b = np.random.rand(1000000)
c = np.dot(a,b)

      是不是很简单呢?在数据科学的学习过程,还将大量用到这个强大的工具,想想还真是有点小兴奋呢。


论文与工程训练总结

      本周呢由于唐奖和某些乱七八糟的事情,我也没有阅读新的论文,但是学习了增强学习Reinforcement Learning领域,DQN的部分知识,也了解到了MDP即马尔科夫过程是一个怎样的决策过程,对增强学习的世界观有了进一步的了解,也算是基础的入门。虽然仅仅学习了一些这方面的知识,不过也引起了我极大的兴趣,可能也是因为我自己觉得这样的技术更符合我对人工智能的预期吧!工程方面,本周抽了两天的时间做了下项目,感觉敲代码的过程还是很爽的,哈哈。嗯,下个月还有大学生涯最后的一次ACM-Region(好吧,其实也是唯一一次),继续努力吧!

你可能感兴趣的:(算法,深度学习,机器学习)