You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

6_1-sgd.ipynb 90 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "# 随机梯度下降法\n",
  8. "前面我们介绍了梯度下降法的数学原理,下面我们通过例子来说明一下随机梯度下降法,我们分别从 0 自己实现,以及使用 pytorch 中自带的优化器"
  9. ]
  10. },
  11. {
  12. "cell_type": "code",
  13. "execution_count": 1,
  14. "metadata": {},
  15. "outputs": [],
  16. "source": [
  17. "import numpy as np\n",
  18. "import torch\n",
  19. "from torchvision.datasets import MNIST # 导入 pytorch 内置的 mnist 数据\n",
  20. "from torch.utils.data import DataLoader\n",
  21. "from torch import nn\n",
  22. "from torch.autograd import Variable\n",
  23. "import time\n",
  24. "import matplotlib.pyplot as plt\n",
  25. "%matplotlib inline\n",
  26. "\n",
  27. "def data_tf(x):\n",
  28. " x = np.array(x, dtype='float32') / 255 # 将数据变到 0 ~ 1 之间\n",
  29. " x = (x - 0.5) / 0.5 # 标准化,这个技巧之后会讲到\n",
  30. " x = x.reshape((-1,)) # 拉平\n",
  31. " x = torch.from_numpy(x)\n",
  32. " return x\n",
  33. "\n",
  34. "train_set = MNIST('../../data/mnist', train=True, transform=data_tf, download=True) # 载入数据集,申明定义的数据变换\n",
  35. "test_set = MNIST('../../data/mnist', train=False, transform=data_tf, download=True)\n",
  36. "\n",
  37. "# 定义 loss 函数\n",
  38. "criterion = nn.CrossEntropyLoss()"
  39. ]
  40. },
  41. {
  42. "cell_type": "markdown",
  43. "metadata": {},
  44. "source": [
  45. "随机梯度下降法非常简单,公式就是\n",
  46. "$$\n",
  47. "\\theta_{i+1} = \\theta_i - \\eta \\nabla L(\\theta)\n",
  48. "$$\n",
  49. "非常简单,我们可以从 0 开始自己实现"
  50. ]
  51. },
  52. {
  53. "cell_type": "code",
  54. "execution_count": 3,
  55. "metadata": {},
  56. "outputs": [],
  57. "source": [
  58. "def sgd_update(parameters, lr):\n",
  59. " for param in parameters:\n",
  60. " param.data = param.data - lr * param.grad.data"
  61. ]
  62. },
  63. {
  64. "cell_type": "markdown",
  65. "metadata": {},
  66. "source": [
  67. "我们可以将 batch size 先设置为 1,看看有什么效果"
  68. ]
  69. },
  70. {
  71. "cell_type": "code",
  72. "execution_count": 5,
  73. "metadata": {},
  74. "outputs": [
  75. {
  76. "name": "stdout",
  77. "output_type": "stream",
  78. "text": [
  79. "epoch: 0, Train Loss: 0.342559\n",
  80. "epoch: 1, Train Loss: 0.211873\n",
  81. "epoch: 2, Train Loss: 0.176027\n",
  82. "epoch: 3, Train Loss: 0.154809\n",
  83. "epoch: 4, Train Loss: 0.135904\n",
  84. "使用时间: 222.56181 s\n"
  85. ]
  86. }
  87. ],
  88. "source": [
  89. "train_data = DataLoader(train_set, batch_size=1, shuffle=True)\n",
  90. "# 使用 Sequential 定义 3 层神经网络\n",
  91. "net = nn.Sequential(\n",
  92. " nn.Linear(784, 200),\n",
  93. " nn.ReLU(),\n",
  94. " nn.Linear(200, 10),\n",
  95. ")\n",
  96. "\n",
  97. "# 开始训练\n",
  98. "losses1 = []\n",
  99. "idx = 0\n",
  100. "\n",
  101. "start = time.time() # 记时开始\n",
  102. "for e in range(5):\n",
  103. " train_loss = 0\n",
  104. " for im, label in train_data:\n",
  105. " im = Variable(im)\n",
  106. " label = Variable(label)\n",
  107. " # 前向传播\n",
  108. " out = net(im)\n",
  109. " loss = criterion(out, label)\n",
  110. " # 反向传播\n",
  111. " net.zero_grad()\n",
  112. " loss.backward()\n",
  113. " sgd_update(net.parameters(), 1e-2) # 使用 0.01 的学习率\n",
  114. " # 记录误差\n",
  115. " train_loss += loss.item()\n",
  116. " if idx % 30 == 0:\n",
  117. " losses1.append(loss.item())\n",
  118. " idx += 1\n",
  119. " print('epoch: {}, Train Loss: {:.6f}'\n",
  120. " .format(e, train_loss / len(train_data)))\n",
  121. "end = time.time() # 计时结束\n",
  122. "print('使用时间: {:.5f} s'.format(end - start))"
  123. ]
  124. },
  125. {
  126. "cell_type": "code",
  127. "execution_count": 6,
  128. "metadata": {},
  129. "outputs": [
  130. {
  131. "data": {
  132. "text/plain": [
  133. "<matplotlib.legend.Legend at 0x7f763c4e5ca0>"
  134. ]
  135. },
  136. "execution_count": 6,
  137. "metadata": {},
  138. "output_type": "execute_result"
  139. },
  140. {
  141. "data": {
  142. "image/png": "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\n",
  143. "text/plain": [
  144. "<Figure size 432x288 with 1 Axes>"
  145. ]
  146. },
  147. "metadata": {
  148. "needs_background": "light"
  149. },
  150. "output_type": "display_data"
  151. }
  152. ],
  153. "source": [
  154. "x_axis = np.linspace(0, 5, len(losses1), endpoint=True)\n",
  155. "plt.semilogy(x_axis, losses1, label='batch_size=1')\n",
  156. "plt.legend(loc='best')"
  157. ]
  158. },
  159. {
  160. "cell_type": "markdown",
  161. "metadata": {},
  162. "source": [
  163. "可以看到,loss 在剧烈震荡,因为每次都是只对一个样本点做计算,每一层的梯度都具有很高的随机性,而且需要耗费了大量的时间"
  164. ]
  165. },
  166. {
  167. "cell_type": "code",
  168. "execution_count": 3,
  169. "metadata": {},
  170. "outputs": [
  171. {
  172. "name": "stdout",
  173. "output_type": "stream",
  174. "text": [
  175. "epoch: 0, Train Loss: 0.735301\n",
  176. "epoch: 1, Train Loss: 0.362765\n",
  177. "epoch: 2, Train Loss: 0.316051\n",
  178. "epoch: 3, Train Loss: 0.287766\n",
  179. "epoch: 4, Train Loss: 0.264757\n",
  180. "使用时间: 40.03663 s\n"
  181. ]
  182. }
  183. ],
  184. "source": [
  185. "train_data = DataLoader(train_set, batch_size=64, shuffle=True)\n",
  186. "# 使用 Sequential 定义 3 层神经网络\n",
  187. "net = nn.Sequential(\n",
  188. " nn.Linear(784, 200),\n",
  189. " nn.ReLU(),\n",
  190. " nn.Linear(200, 10),\n",
  191. ")\n",
  192. "\n",
  193. "# 开始训练\n",
  194. "losses2 = []\n",
  195. "idx = 0\n",
  196. "start = time.time() # 记时开始\n",
  197. "for e in range(5):\n",
  198. " train_loss = 0\n",
  199. " for im, label in train_data:\n",
  200. " im = Variable(im)\n",
  201. " label = Variable(label)\n",
  202. " # 前向传播\n",
  203. " out = net(im)\n",
  204. " loss = criterion(out, label)\n",
  205. " # 反向传播\n",
  206. " net.zero_grad()\n",
  207. " loss.backward()\n",
  208. " sgd_update(net.parameters(), 1e-2)\n",
  209. " # 记录误差\n",
  210. " train_loss += loss.item()\n",
  211. " if idx % 30 == 0:\n",
  212. " losses2.append(loss.item())\n",
  213. " idx += 1\n",
  214. " print('epoch: {}, Train Loss: {:.6f}'\n",
  215. " .format(e, train_loss / len(train_data)))\n",
  216. "end = time.time() # 计时结束\n",
  217. "print('使用时间: {:.5f} s'.format(end - start))"
  218. ]
  219. },
  220. {
  221. "cell_type": "code",
  222. "execution_count": 4,
  223. "metadata": {},
  224. "outputs": [
  225. {
  226. "data": {
  227. "text/plain": [
  228. "<matplotlib.legend.Legend at 0x103d0a748>"
  229. ]
  230. },
  231. "execution_count": 4,
  232. "metadata": {},
  233. "output_type": "execute_result"
  234. },
  235. {
  236. "data": {
  237. "image/png": "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\n0AOEE3qAcA9RQjQEnHV9sQAAAABJRU5ErkJggg==\n",
  238. "text/plain": [
  239. "<matplotlib.figure.Figure at 0x103d0a7b8>"
  240. ]
  241. },
  242. "metadata": {},
  243. "output_type": "display_data"
  244. }
  245. ],
  246. "source": [
  247. "x_axis = np.linspace(0, 5, len(losses2), endpoint=True)\n",
  248. "plt.semilogy(x_axis, losses2, label='batch_size=64')\n",
  249. "plt.legend(loc='best')"
  250. ]
  251. },
  252. {
  253. "cell_type": "markdown",
  254. "metadata": {},
  255. "source": [
  256. "通过上面的结果可以看到 loss 没有 batch 等于 1 震荡那么距离,同时也可以降到一定的程度了,时间上也比之前快了非常多,因为按照 batch 的数据量计算上更快,同时梯度对比于 batch size = 1 的情况也跟接近真实的梯度,所以 batch size 的值越大,梯度也就越稳定,而 batch size 越小,梯度具有越高的随机性,这里 batch size 为 64,可以看到 loss 仍然存在震荡,但这并没有关系,如果 batch size 太大,对于内存的需求就更高,同时也不利于网络跳出局部极小点,所以现在普遍使用基于 batch 的随机梯度下降法,而 batch 的多少基于实际情况进行考虑"
  257. ]
  258. },
  259. {
  260. "cell_type": "markdown",
  261. "metadata": {},
  262. "source": [
  263. "下面我们调高学习率,看看有什么样的结果"
  264. ]
  265. },
  266. {
  267. "cell_type": "code",
  268. "execution_count": 9,
  269. "metadata": {},
  270. "outputs": [
  271. {
  272. "name": "stdout",
  273. "output_type": "stream",
  274. "text": [
  275. "epoch: 0, Train Loss: 2.462500\n",
  276. "epoch: 1, Train Loss: 2.304734\n",
  277. "epoch: 2, Train Loss: 2.305732\n",
  278. "epoch: 3, Train Loss: 2.304950\n",
  279. "epoch: 4, Train Loss: 2.304857\n",
  280. "使用时间: 42.85314 s\n"
  281. ]
  282. }
  283. ],
  284. "source": [
  285. "train_data = DataLoader(train_set, batch_size=64, shuffle=True)\n",
  286. "# 使用 Sequential 定义 3 层神经网络\n",
  287. "net = nn.Sequential(\n",
  288. " nn.Linear(784, 200),\n",
  289. " nn.ReLU(),\n",
  290. " nn.Linear(200, 10),\n",
  291. ")\n",
  292. "\n",
  293. "# 开始训练\n",
  294. "losses3 = []\n",
  295. "idx = 0\n",
  296. "start = time.time() # 记时开始\n",
  297. "for e in range(5):h\n",
  298. " train_loss = 0\n",
  299. " for im, label in train_data:\n",
  300. " im = Variable(im)\n",
  301. " label = Variable(label)\n",
  302. " # 前向传播\n",
  303. " out = net(im)\n",
  304. " loss = criterion(out, label)\n",
  305. " # 反向传播\n",
  306. " net.zero_grad()\n",
  307. " loss.backward()\n",
  308. " sgd_update(net.parameters(), 1) # 使用 1.0 的学习率\n",
  309. " # 记录误差\n",
  310. " train_loss += loss.item()\n",
  311. " if idx % 30 == 0:\n",
  312. " losses3.append(loss.item())\n",
  313. " idx += 1\n",
  314. " print('epoch: {}, Train Loss: {:.6f}'\n",
  315. " .format(e, train_loss / len(train_data)))\n",
  316. "end = time.time() # 计时结束\n",
  317. "print('使用时间: {:.5f} s'.format(end - start))"
  318. ]
  319. },
  320. {
  321. "cell_type": "code",
  322. "execution_count": 11,
  323. "metadata": {},
  324. "outputs": [
  325. {
  326. "data": {
  327. "text/plain": [
  328. "<matplotlib.legend.Legend at 0x11cb9e208>"
  329. ]
  330. },
  331. "execution_count": 11,
  332. "metadata": {},
  333. "output_type": "execute_result"
  334. },
  335. {
  336. "data": {
  337. "image/png": "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\n",
  338. "text/plain": [
  339. "<matplotlib.figure.Figure at 0x11c1d6b70>"
  340. ]
  341. },
  342. "metadata": {},
  343. "output_type": "display_data"
  344. }
  345. ],
  346. "source": [
  347. "x_axis = np.linspace(0, 5, len(losses3), endpoint=True)\n",
  348. "plt.semilogy(x_axis, losses3, label='lr = 1')\n",
  349. "plt.legend(loc='best')"
  350. ]
  351. },
  352. {
  353. "cell_type": "markdown",
  354. "metadata": {},
  355. "source": [
  356. "可以看到,学习率太大会使得损失函数不断回跳,从而无法让损失函数较好降低,所以我们一般都是用一个比较小的学习率"
  357. ]
  358. },
  359. {
  360. "cell_type": "markdown",
  361. "metadata": {},
  362. "source": [
  363. "实际上我们并不用自己造轮子,因为 pytorch 中已经为我们内置了随机梯度下降发,而且之前我们一直在使用,下面我们来使用 pytorch 自带的优化器来实现随机梯度下降"
  364. ]
  365. },
  366. {
  367. "cell_type": "code",
  368. "execution_count": 8,
  369. "metadata": {},
  370. "outputs": [
  371. {
  372. "name": "stdout",
  373. "output_type": "stream",
  374. "text": [
  375. "epoch: 0, Train Loss: 0.747158\n",
  376. "epoch: 1, Train Loss: 0.364107\n",
  377. "epoch: 2, Train Loss: 0.318209\n",
  378. "epoch: 3, Train Loss: 0.290282\n",
  379. "epoch: 4, Train Loss: 0.268150\n",
  380. "使用时间: 46.75882 s\n"
  381. ]
  382. }
  383. ],
  384. "source": [
  385. "train_data = DataLoader(train_set, batch_size=64, shuffle=True)\n",
  386. "# 使用 Sequential 定义 3 层神经网络\n",
  387. "net = nn.Sequential(\n",
  388. " nn.Linear(784, 200),\n",
  389. " nn.ReLU(),\n",
  390. " nn.Linear(200, 10),\n",
  391. ")\n",
  392. "\n",
  393. "optimzier = torch.optim.SGD(net.parameters(), 1e-2)\n",
  394. "# 开始训练\n",
  395. "\n",
  396. "start = time.time() # 记时开始\n",
  397. "for e in range(5):\n",
  398. " train_loss = 0\n",
  399. " for im, label in train_data:\n",
  400. " im = Variable(im)\n",
  401. " label = Variable(label)\n",
  402. " # 前向传播\n",
  403. " out = net(im)\n",
  404. " loss = criterion(out, label)\n",
  405. " # 反向传播\n",
  406. " optimzier.zero_grad()\n",
  407. " loss.backward()\n",
  408. " optimzier.step()\n",
  409. " # 记录误差\n",
  410. " train_loss += loss.item()\n",
  411. " print('epoch: {}, Train Loss: {:.6f}'\n",
  412. " .format(e, train_loss / len(train_data)))\n",
  413. "end = time.time() # 计时结束\n",
  414. "print('使用时间: {:.5f} s'.format(end - start))"
  415. ]
  416. }
  417. ],
  418. "metadata": {
  419. "kernelspec": {
  420. "display_name": "Python 3 (ipykernel)",
  421. "language": "python",
  422. "name": "python3"
  423. },
  424. "language_info": {
  425. "codemirror_mode": {
  426. "name": "ipython",
  427. "version": 3
  428. },
  429. "file_extension": ".py",
  430. "mimetype": "text/x-python",
  431. "name": "python",
  432. "nbconvert_exporter": "python",
  433. "pygments_lexer": "ipython3",
  434. "version": "3.9.7"
  435. }
  436. },
  437. "nbformat": 4,
  438. "nbformat_minor": 2
  439. }

机器学习越来越多应用到飞行器、机器人等领域,其目的是利用计算机实现类似人类的智能,从而实现装备的智能化与无人化。本课程旨在引导学生掌握机器学习的基本知识、典型方法与技术,通过具体的应用案例激发学生对该学科的兴趣,鼓励学生能够从人工智能的角度来分析、解决飞行器、机器人所面临的问题和挑战。本课程主要内容包括Python编程基础,机器学习模型,无监督学习、监督学习、深度学习基础知识与实现,并学习如何利用机器学习解决实际问题,从而全面提升自我的《综合能力》。