WEBVTT

00:00.330 --> 00:04.950
大家好, 欢迎学习本教程, 这几乎是本模块的最后一个教程｡ 

00:04.950 --> 00:11.870
在我们得到令人兴奋的结果并观看视频之前, 我将解释执行整个过程的主要代码｡

00:11.880 --> 00:15.690
这是主代码, 如你所见, 这段代码很短｡ 

00:15.690 --> 00:21.060
我们首先导入库和模块, 以及我们创建的不同类和函数,

00:21.060 --> 00:28.680
例如模型文件中的active critic､ train文件中的train函数和test文件中的test函数｡

00:28.680 --> 00:31.200
当然, 我们还导入了优化器｡ 

00:31.710 --> 00:39.510
然后我们从第一部分开始, 我们进入一个类, 所有的参数, 这是这个参数｡

00:39.510 --> 00:48.720
记住, 这是我们每次从params类中创建的params对象, 比如学习率, gamma或tau｡

00:48.930 --> 00:50.610
让我们快速浏览一下｡ 

00:50.610 --> 00:54.270
第一个R是学习率｡ 

00:54.270 --> 00:56.610
所以如你所见, 我们选择了一个小的学习率｡ 

00:56.820 --> 00:59.010
第二个是gamma参数｡ 

00:59.010 --> 01:01.920
同样, 我们将其视为8｡  99.

01:01.920 --> 01:10.620
我们采用一个类型参数, 一组116个进程, 20个步骤, 最大长度为10, 000｡ 

01:10.620 --> 01:12.210
还记得我们说过的吗

01:12.330 --> 01:18.870
这是我们设置的参数, 以确保代理不会无限期地陷入环境状态｡

01:18.870 --> 01:24.630
所以这将停止游戏, 如果插曲长度超过这个最大插曲长度｡ 

01:24.750 --> 01:30.780
当然, 最终我们得到了环境的名称, 去掉了零｡ 

01:30.780 --> 01:38.130
顺便说一下, 你也可以在其他环境中玩, 只要改变这个环境的名称｡

01:38.130 --> 01:43.800
所以, 如果你想玩一些其他的突破版本,

01:43.800 --> 01:52.890
甚至一些其他雅达利游戏, 好吧, 你可以简单地取代这个突破视觉这里的一些其他游戏, 但我可以告诉你, 突破视频已经非常具有挑战性｡

01:53.580 --> 01:53.910
好吧, 我会的

01:53.910 --> 01:59.250
所以这里所有的参数, 然后是主运行的主代码｡ 

01:59.250 --> 02:02.610
这里, 让我们看看我们在第一行做了什么｡ 

02:02.610 --> 02:05.100
我们为每个内核设置一个线程｡ 

02:05.130 --> 02:13.950
然后在第二行中, 我们通过创建params类的一个对象来获取所有参数, 该对象将获取一个initialize｡

02:13.980 --> 02:19.380
所有这些参数都在这里, 因为有变量附加到这个参数对象上｡ 

02:19.380 --> 02:29.910
然后设置种子, 然后使用create条目和函数获取环境, 并使用环境的名称（从零开始）｡

02:29.910 --> 02:35.100
您会看到该env名称, 因此该env名称的params会以零分隔｡ 

02:35.100 --> 02:37.650
这样我们就能得到突围的环境｡ 

02:37.650 --> 02:42.540
顺便说一句,

02:42.540 --> 02:52.560
这不是创建环境的常用方法, 而是为了改进整个流程并提高性能, 同时我们使用它来实际创建一个优化的环境, 这要归功于Universe｡

02:52.560 --> 02:57.150
Universe是一个软件包, 它附带了您在露天安装的所有软件包｡ 

02:57.630 --> 03:01.380
多亏了宇宙, 我们得到了一个优化的环境.

03:01.380 --> 03:03.240
这就是这里的一切｡ 

03:03.860 --> 03:09.050
然后, 我们通过创建一个活动评论家类的对象来获得共享模型｡ 

03:09.050 --> 03:14.990
因此, 在这里, 重要的是要理解这个共享模型是由不同的代理共享的模型｡

03:14.990 --> 03:17.690
因此, 我们在不同的内核中有不同的线程｡ 

03:17.990 --> 03:25.370
说到下一行的线程, 即共享内存的共享模型,

03:25.370 --> 03:32.780
我们要做的是将模型存储在计算机的共享内存中, 以便所有线程都可以访问它, 即使它们位于不同的内核中｡

03:32.780 --> 03:34.400
这就是我们要做的｡ 

03:34.400 --> 03:36.440
这是为了启用这个｡ 

03:36.620 --> 03:45.440
然后, 我们将优化器链接到共享模型的参数, 并且学习率为0｡

03:45.440 --> 03:45.440
01.

03:45.650 --> 03:50.870
同样, 必须了解优化器也是共享的, 因为它将对共享模型进行操作,

03:50.870 --> 03:55.940
而下一行中的优化器将对共享内存进行优化｡

03:55.940 --> 04:02.330
我们将优化器存储在共享内存中, 以便所有代理都可以访问它来优化模型｡

04:02.720 --> 04:10.190
然后, 我们初始化我们的流程, 这样测试流程就不会更新共享模型, 而只是使用它在一个零件上进行测试,

04:10.190 --> 04:14.660
并打印分数和录制视频｡

04:14.660 --> 04:17.720
这正是Target Equals Test所做的｡ 

04:17.720 --> 04:24.230
这就是测试过程, 这个过程是从多个预处理过程中得到的｡ 

04:24.230 --> 04:31.490
所以这里它所做的就是在一个独立的线程上运行一个函数｡ 

04:31.580 --> 04:38.060
所以当我们执行P start的时候, 我们启动了一个新的进程, 它是在这一行初始化的｡ 

04:38.060 --> 04:44.990
然后用这个附加了P的进程, 我们把这个进程添加到进程列表中｡ 

04:44.990 --> 04:54.230
最后, 在这个循环中, 我们只做一个循环来运行所有其他的过程, 这些过程将通过更新共享模型来训练｡

04:54.470 --> 04:57.860
这基本上就是最后几行代码所发生的事情｡ 

04:58.130 --> 05:03.350
因此, 如果您不想深入了解它的细节, 重要的是要了解,

05:03.350 --> 05:09.230
这将以最佳方式运行流程, 因此我们都应该执行此代码, 并有一个经过训练的模型,

05:09.230 --> 05:12.530
最终观察结果｡

05:12.530 --> 05:14.060
所以我等不及要这么做了｡ 

05:14.060 --> 05:15.830
这将是相当令人兴奋的｡ 

05:15.830 --> 05:19.130
我现在会努力找到关键角色, 这样我们就可以一起看了｡ 

05:19.130 --> 05:21.560
所以在下一次之前, 好好享受我｡ 
