WEBVTT

00:00.270 --> 00:02.610
Xin chào và chào mừng bạn đến với hướng dẫn Python này.

00:02.640 --> 00:06.720
Được rồi, chúng tôi vừa cập nhật bộ nhớ sau khi đạt đến trạng thái mới.

00:06.720 --> 00:08.880
Và bây giờ chúng ta hãy quan tâm đến bản cập nhật tiếp theo.

00:09.240 --> 00:12.240
Theo bạn bây giờ, đâu sẽ là bản cập nhật tiếp theo?

00:12.570 --> 00:16.560
Về cơ bản, chúng ta đã thực hiện xong một quá trình chuyển đổi.

00:16.590 --> 00:20.930
Chúng tôi đã xác định ngày thành phần cuối cùng của quá trình chuyển đổi, đó là trạng thái mới.

00:20.940 --> 00:23.310
Vì vậy, bây giờ giống như chúng ta đang bắt đầu lại từ đầu.

00:23.310 --> 00:27.390
Và khi chúng ta bắt đầu lại từ đầu, bạn biết đấy, chúng ta đang ở trong tình trạng môi

00:27.390 --> 00:28.140
trường mới này.

00:28.140 --> 00:31.230
Và vì vậy chúng ta cần làm gì bây giờ một cách tự nhiên?

00:31.260 --> 00:37.120
Tất nhiên, đó là để chơi một hành động vì chúng tôi đã có quan sát về trạng thái mới.

00:37.170 --> 00:40.380
Vì vậy, bây giờ điều mà chúng ta phải làm là chơi một hành động.

00:40.620 --> 00:46.720
Và do đó, điều chúng ta cần làm bây giờ tất nhiên là sử dụng chức năng select action để chơi action.

00:46.740 --> 00:47.580
Vì vậy, chúng ta hãy làm điều đó.

00:47.580 --> 00:54.150
Hãy tạo một hành động biến mới và hãy chơi hành động với hàm hành động chọn.

00:54.150 --> 01:02.100
Vì vậy, trước tiên tôi đang tự xác định rằng hàm hành động chọn là một phương thức của đối tượng của

01:02.100 --> 01:04.220
lớp khác sẽ được tạo.

01:04.230 --> 01:08.490
Vì vậy, tự chấm hành động chọn.

01:08.490 --> 01:11.010
Ở đây chúng tôi bắt đầu, tự chấm chọn hành động.

01:11.010 --> 01:17.550
Và tất nhiên vì hàm hành động chọn lấy trạng thái làm đầu vào vì tất nhiên hàm hành

01:17.550 --> 01:24.210
động chọn sẽ trả về đầu ra của mạng nơ-ron khi trạng thái đầu vào hiện tại đi vào

01:24.210 --> 01:25.140
mạng nơ-ron.

01:25.230 --> 01:27.450
Vì vậy, chúng ta phải nhập trạng thái đầu vào ở đây.

01:27.570 --> 01:33.450
Và vì đó là trạng thái mà chúng ta vừa đạt được trong môi trường hiện tại mà trạng thái đầu vào

01:33.450 --> 01:40.020
tất nhiên là trạng thái mới bởi vì trạng thái mà chúng ta vừa đạt được vào thời điểm hiện tại là trạng thái mới.

01:40.020 --> 01:44.970
Vì vậy, trong chức năng hành động chọn, tôi đang nhập trạng thái mới.

01:44.970 --> 01:45.420
Được rồi.

01:45.420 --> 01:51.480
Vì vậy, với dòng mã này, chúng tôi chỉ cần chơi hành động mới sau khi đạt đến trạng thái mới.

01:51.990 --> 01:52.340
Được chứ.

01:52.350 --> 01:58.080
Và bây giờ chúng tôi chơi nó trong thực tế, chúng tôi nhận được phần thưởng và do đó chúng tôi nhận được phản hồi với

01:58.080 --> 01:58.740
phần thưởng.

01:58.740 --> 02:04.590
Và do đó, nếu chúng ta có hơn 100 phần tử trong bộ nhớ thì đã đến lúc phải học.

02:04.590 --> 02:10.530
Và do đó, những gì chúng ta phải làm bây giờ là những gì đến một cách hợp lý sau khi lựa chọn một hành

02:10.530 --> 02:15.600
động, tất nhiên, đó là tìm hiểu nhu cầu, bắt đầu học nếu hành động đó đang thực hiện đúng cách.

02:15.600 --> 02:22.470
Và bây giờ vì nó chỉ đóng vai trò hành động mà chúng tôi sẽ làm cho AI học hỏi từ các hành động của nó trong

02:22.470 --> 02:23.850
100 sự kiện vừa qua.

02:23.970 --> 02:31.260
Nhưng trước khi áp dụng chức năng học này, chúng ta phải tạo điều kiện if này để đảm bảo rằng chúng ta đã đạt hơn

02:31.260 --> 02:36.630
100 sự kiện bởi vì, bạn biết đấy, chúng ta đang học từ các mẫu ngẫu nhiên của

02:36.630 --> 02:37.260
bộ nhớ.

02:37.260 --> 02:40.920
Bạn biết đấy, chúng tôi có bộ nhớ khổng lồ gồm 10.000 phần tử.

02:40.920 --> 02:45.150
Chúng tôi đang lấy một số mẫu ngẫu nhiên của bộ nhớ gồm 100 phần tử.

02:45.150 --> 02:52.620
Và AI đang học hỏi từ thông tin có trong 100 mẫu chuyển đổi ngẫu nhiên này.

02:52.620 --> 03:00.660
Vì vậy, hãy cứ làm điều kiện này nếu để đảm bảo rằng số phần tử của bộ nhớ, bộ nhớ tự

03:00.660 --> 03:02.820
chấm rồi hãy cẩn thận.

03:02.820 --> 03:04.140
Chỉ cần một mẹo nhỏ ở đây.

03:04.140 --> 03:10.680
Bộ nhớ tự chấm là đối tượng của lớp bộ nhớ phát lại, nhưng sau đó lớp bộ nhớ phát lại có một

03:10.680 --> 03:12.330
thuộc tính là bộ nhớ.

03:12.330 --> 03:15.240
Vì vậy, trên thực tế, chúng ta cần phải tự ghi nhớ.

03:15.240 --> 03:25.140
Bộ nhớ đó, bộ nhớ đầu tiên là đối tượng của lớp bộ nhớ phát lại và bộ nhớ thứ hai là thuộc tính ở

03:25.170 --> 03:27.360
đây là bộ nhớ tự.

03:27.980 --> 03:36.470
Vì vậy, nếu số phần tử trong bộ nhớ là những gì chúng ta muốn nó lớn hơn 100 thì được tô màu.

03:36.680 --> 03:38.670
Và sau đó điều gì xảy ra?

03:38.690 --> 03:45.470
Chà, chúng ta có thể học, nhưng trước khi học, chúng ta cần lấy mẫu ngẫu nhiên gồm 100 phép chuyển đổi.

03:45.470 --> 03:48.500
Và điều này chúng ta có thể nhận được với hàm mẫu.

03:48.590 --> 03:54.500
Và vì hàm mẫu trả về các lô khác nhau, các trạng thái đặt thời gian t các trạng thái là 20 cộng

03:54.530 --> 03:55.130
với một.

03:55.130 --> 03:57.740
Các hành động là thời gian t và phần thưởng cho thời gian t.

03:57.890 --> 04:03.320
Chà, những gì chúng ta cần làm bây giờ là tạo một số biến mới sẽ là lô các trạng thái tại

04:03.320 --> 04:07.840
thời điểm t là lô các trạng thái tiếp theo, lô phần thưởng và loạt các hành động.

04:07.850 --> 04:15.950
Và chúng ta có thể chỉ cần đặt tên giống như chúng ta đã đặt cho các đối số ở đây và dán nó vào đây.

04:15.950 --> 04:24.650
Và các biến này sẽ bằng với những gì hàm mẫu trả về vì nó trả về chính xác các lô

04:24.650 --> 04:25.950
trạng thái này.

04:25.970 --> 04:28.060
Tiếp theo nêu phần thưởng và hành động.

04:28.070 --> 04:33.620
Vì vậy, những gì chúng ta đơn giản cần làm bây giờ là lấy đối tượng bộ nhớ của chúng ta trước.

04:33.620 --> 04:40.280
Và sau đó từ đối tượng bộ nhớ này, chúng ta sẽ sử dụng phương thức mẫu sẽ lấy làm đầu vào.

04:40.280 --> 04:46.250
Chà, số lượng chuyển đổi mà chúng tôi muốn AI của mình học được từ đó là 100.

04:46.370 --> 04:50.300
Đó là lý do tại sao chúng tôi đảm bảo rằng bộ nhớ có hơn 100 lần chuyển đổi.

04:50.300 --> 04:54.620
Vì vậy, nó sẽ học từ 100 quá trình chuyển đổi của bộ nhớ.

04:54.620 --> 04:56.390
Như vậy việc học sẽ tốt hơn rất nhiều.

04:56.390 --> 04:59.450
Và vì vậy bây giờ chúng ta hãy biến việc học này thành hiện thực.

04:59.450 --> 05:06.350
Chà, vì phương thức học là một phương thức của lớp khuếch tán của chúng ta, nên chúng ta cần truy cập

05:06.350 --> 05:11.720
phương thức học này từ các đối tượng trong tương lai sẽ được tạo từ lớp khác.

05:11.720 --> 05:14.240
Và do đó, những gì chúng ta cần lấy là bản thân.

05:14.240 --> 05:23.000
Vì vậy, bản thân tham chiếu đối tượng đó đến lớp và sau đó học như phương pháp học này, phương pháp học mà chúng ta

05:23.000 --> 05:23.690
nhập vào.

05:23.690 --> 05:30.080
Tất nhiên những người này ở đây, lô ghi lô, ngày tiếp theo, phần thưởng theo lô và hành động theo lô.

05:30.470 --> 05:38.900
Vì vậy, đây là các lô của chúng tôi được lấy mẫu từ bộ nhớ của chúng tôi và chúng tôi nhận được 100 trong số đó bởi vì chúng tôi có 100 lần chuyển đổi.

05:38.900 --> 05:46.220
Và từ 100 lần chuyển đổi này, chúng tôi có 100 trạng thái, 106 trạng thái, 100 phần thưởng và 100 hành động.

05:47.190 --> 05:49.590
Vì vậy, chúng ta hãy chơi ở đây và ở đó chúng ta đi.

05:49.590 --> 05:51.480
Bây giờ việc học sẽ diễn ra.

05:51.630 --> 05:54.150
Nó sẽ xảy ra từ tất cả các lô ngẫu nhiên này.

05:54.480 --> 05:55.290
Hoàn hảo.

05:55.680 --> 06:03.270
Và bây giờ những gì chúng ta cần làm là cập nhật cuối cùng, bạn biết đấy, đạt đến trạng thái mới và chơi một

06:03.270 --> 06:04.010
hành động.

06:04.020 --> 06:10.560
Chà, chúng tôi đã có hành động để chơi, nhưng chúng tôi vẫn không cập nhật hành động đó là bản thân của chúng tôi, biến hành động

06:10.560 --> 06:11.460
cuối cùng đó.

06:11.460 --> 06:13.530
Vì vậy, hãy chắc chắn rằng chúng ta không quên điều này.

06:13.530 --> 06:14.850
Hãy làm điều đó ngay bây giờ.

06:14.880 --> 06:24.750
Chúng tôi sẽ cập nhật hành động cuối cùng tự chấm hành động cuối cùng bằng và tất nhiên hành động mà chúng tôi vừa chơi ở đây với

06:24.750 --> 06:26.760
chức năng hành động chọn.

06:27.030 --> 06:27.450
Được rồi.

06:27.450 --> 06:30.300
Vì vậy, bây giờ hành động cuối cùng được cập nhật sau đó.

06:30.300 --> 06:31.680
Tương tự cho trạng thái mới.

06:31.680 --> 06:38.400
Chúng tôi đã đạt đến trạng thái mới, nhưng chúng tôi vẫn chưa cập nhật trạng thái cuối cùng vì tất nhiên trạng thái cuối

06:38.400 --> 06:40.530
cùng là trước trạng thái lúc 20.

06:40.530 --> 06:44.760
Nhưng kể từ bây giờ chúng tôi đạt đến trạng thái mới là T cộng một tại một thời điểm T cộng một.

06:44.760 --> 06:49.980
Chà, trạng thái cuối cùng trở thành trạng thái mới này ở đây và do đó chúng tôi cũng cần cập nhật nó.

06:50.010 --> 06:56.040
Tự chấm trạng thái cuối cùng bằng trạng thái mới của chúng tôi.

06:57.120 --> 06:57.940
Chúng ta bắt đầu.

06:57.960 --> 06:59.550
Và bây giờ chúng ta cần cập nhật những gì?

06:59.580 --> 07:01.460
Chà, chỉ còn một thứ.

07:01.470 --> 07:03.270
Tất nhiên, đó là phần thưởng.

07:03.420 --> 07:08.060
Và phần thưởng chính xác là phần thưởng mà chúng ta nhận được trong thực tế.

07:08.070 --> 07:14.610
Vì vậy, đó sẽ là đối số của chức năng cập nhật này, nếu chúng tôi thực hiện kết nối với bản đồ

07:14.610 --> 07:16.920
của mình, sẽ là phần thưởng cuối cùng.

07:16.920 --> 07:23.210
Đó là phần thưởng chúng ta nhận được ngay sau khi chơi hành động ở trạng thái mới đạt được này.

07:23.220 --> 07:28.020
Vì vậy, nếu chúng ta tiếp tục với một số đã gửi, phần thưởng cuối cùng này sẽ bị trừ đi một phần.

07:28.140 --> 07:31.950
Nếu chúng tôi tiến xa hơn mục tiêu, chúng tôi sẽ nhận được phần thưởng tốt hơn một chút.

07:31.950 --> 07:33.330
Trừ 0. 2.

07:33.360 --> 07:38.550
Nếu chúng ta tiến gần hơn đến mục tiêu, chúng ta sẽ nhận được một phần thưởng nhẹ.

07:38.550 --> 07:43.320
Và nếu chúng tôi đến quá gần một mép của bản đồ, thì đó sẽ là một hình phạt tồi tệ.

07:43.320 --> 07:45.180
Chúng tôi sẽ nhận được trừ một cho mỗi cạnh.

07:45.210 --> 07:46.980
Vì vậy, đó là cái cuối cùng chúng tôi nhận được.

07:46.980 --> 07:50.610
Trong thực tế, đó là điều xảy ra thực tế trên bản đồ.

07:50.610 --> 07:53.430
Và đây sẽ là đối số của hàm cập nhật.

07:53.430 --> 07:55.920
Lời cuối cùng này đây, chính xác là lời này.

07:55.920 --> 08:02.250
Và vì đây là đối số của hàm cập nhật tương ứng với phần thưởng này

08:02.250 --> 08:11.850
ở đây và do đó, biến phần thưởng cuối cùng được khởi tạo ở đầu trong hàm init này sẽ trở thành phần thưởng mới mà

08:11.850 --> 08:13.530
chúng ta nhận được.

08:13.530 --> 08:19.260
Trong thực tế, đó là phần thưởng hoặc đó là phần thưởng ít hơn.

08:20.620 --> 08:21.250
Được rồi.

08:21.250 --> 08:23.530
Vì vậy, bây giờ chúng tôi đã cập nhật phần thưởng cuối cùng của mình.

08:23.710 --> 08:29.650
Và bây giờ vì chúng tôi vừa nhận được phần thưởng cuối cùng của mình, nên giờ chúng tôi có thể cập nhật cửa sổ phần thưởng.

08:29.680 --> 08:36.910
Bạn nhớ cửa sổ phần thưởng mà chúng ta đã khởi tạo ở đây là một trong những biến của đối tượng của lớp chúng ta.

08:36.940 --> 08:42.340
Đó là cửa sổ để theo dõi quá trình đào tạo này diễn ra như thế nào bằng cách lấy điểm trung bình

08:42.340 --> 08:44.050
của 100 phần thưởng cuối cùng.

08:44.140 --> 08:49.890
Vì vậy, nó sẽ giống như một cửa sổ trượt cho chúng ta thấy ý nghĩa của phần thưởng đang phát triển như thế nào.

08:49.900 --> 08:55.180
Và vì chúng tôi vừa nhận được phần thưởng cuối cùng của mình, nên chúng tôi có thể cập nhật cửa sổ phần thưởng.

08:55.300 --> 08:56.800
Và vậy làm thế nào để chúng tôi cập nhật nó?

08:56.830 --> 09:00.550
Chà, chúng ta chỉ cần thêm phần thưởng cuối cùng này vào cửa sổ.

09:00.550 --> 09:05.200
Và do đó, những gì tôi sẽ làm là giành lấy phần thưởng của mình.

09:05.200 --> 09:07.490
Phục vụ cửa sổ phần thưởng đó.

09:07.510 --> 09:08.290
Nó đây.

09:08.290 --> 09:12.280
Và sau đó tôi sẽ sử dụng hàm append.

09:12.280 --> 09:16.360
Và bên trong hàm append, chúng ta cần nhập phần tử vào.

09:16.360 --> 09:18.670
Chúng tôi muốn thêm vào cửa sổ phần thưởng.

09:18.670 --> 09:20.560
Và đó là tất nhiên, phần thưởng.

09:21.400 --> 09:21.760
Được rồi.

09:21.760 --> 09:22.440
Hoàn hảo.

09:22.450 --> 09:28.870
Và vì cửa sổ phần thưởng này sẽ có kích thước cố định, bạn biết đấy, nó sẽ không phải là một cửa sổ

09:28.870 --> 09:29.800
đang phát triển.

09:29.800 --> 09:35.200
Nó sẽ là một cửa sổ có kích thước cố định trượt theo thời gian để cho chúng ta thấy sự phát triển của phần thưởng.

09:35.200 --> 09:38.560
Và vì vậy bây giờ chúng ta cần quyết định kích thước của cửa sổ này.

09:38.560 --> 09:43.390
Và nó chỉ đơn giản là số lượng phần thưởng mà chúng ta sẽ có trong cửa sổ này.

09:43.690 --> 09:49.120
Và vì vậy, ví dụ, chúng ta hãy lấy, bạn biết đấy, 1000 cuối cùng có nghĩa là 100 từ cuối cùng.

09:49.120 --> 09:56.200
Và để đảm bảo điều đó, chúng ta sẽ thêm nếu sau đó, Len, thì chúng ta sẽ nhận phần thưởng của mình.

09:57.020 --> 09:57.740
Cửa sổ.

09:57.980 --> 10:06.410
Và chúng tôi chỉ cần thêm vào đây nếu số phần tử trong cửa sổ phần thưởng lớn hơn 1000, tốt,

10:06.410 --> 10:13.640
những gì chúng tôi muốn làm là xóa phần tử đầu tiên của cửa sổ phần thưởng này.

10:13.640 --> 10:18.230
Và phần tử đầu tiên của cửa sổ phần thưởng này có chỉ số bằng không.

10:19.060 --> 10:19.420
Được rồi.

10:19.420 --> 10:24.340
Và bây giờ chúng tôi đảm bảo rằng cửa sổ phần thưởng này sẽ không bao giờ nhận được nhiều hơn 1000 phần tử.

10:24.340 --> 10:27.640
Đó là 1000 nghĩa là 100 phần thưởng cuối cùng.

10:27.850 --> 10:28.570
Thật hoàn hảo.

10:28.570 --> 10:34.510
Đây sẽ là một cửa sổ có kích thước cố định để chúng ta có thể xem liệu phần thưởng có tăng lên hay không và do đó

10:34.510 --> 10:36.640
việc đào tạo có diễn ra tốt đẹp hay không.

10:36.640 --> 10:39.130
Và theo đó, nếu thẻ làm những gì chúng ta muốn.

10:39.730 --> 10:40.570
Hoàn hảo.

10:40.720 --> 10:44.650
Và bây giờ còn lại một việc nhỏ cần làm theo bạn.

10:44.650 --> 10:45.920
Nó sẽ ra sao?

10:45.940 --> 10:52.090
Chà, hãy nhớ rằng chức năng cập nhật này không chỉ cập nhật các yếu tố khác nhau của quá trình chuyển đổi

10:52.090 --> 10:57.910
trong cửa sổ phần thưởng mà còn trả về hành động đã chơi khi đạt đến trạng thái mới này.

10:57.940 --> 11:02.690
Đó là lý do tại sao chúng tôi có trong bản đồ hành động ngang bằng với cập nhật chấm não.

11:02.710 --> 11:04.090
Lời cuối cùng, tín hiệu cuối cùng.

11:04.240 --> 11:09.370
Và do đó nó phải trả lại một cái gì đó và có một cái gì đó nó phải trả lại tất

11:09.370 --> 11:10.330
nhiên là hành động.

11:10.570 --> 11:16.720
Vì vậy, điều đơn giản cuối cùng chúng ta cần làm ở đây chỉ là hành động trở lại.

11:17.080 --> 11:20.020
Hành động được hiển thị khi đạt đến trạng thái mới.

11:20.380 --> 11:21.310
Và đó là nó.

11:21.520 --> 11:23.600
Chức năng cập nhật của chúng tôi đã sẵn sàng.

11:23.620 --> 11:28.990
Nó sẽ thực hiện tất cả các cập nhật được yêu cầu và nó sẽ trả lại hành động khi đạt đến trạng thái mới.

11:29.230 --> 11:30.390
Thật hoàn hảo.

11:30.400 --> 11:34.960
Đó là hành động khó khăn cuối cùng phải thực hiện cho tất cả quá trình này.

11:34.990 --> 11:36.880
Bây giờ phần còn lại sẽ là đồ trẻ con.

11:36.910 --> 11:41.800
Chúng tôi sẽ chỉ tạo một chức năng tính điểm để trả về phương tiện của phần thưởng và cửa sổ phần thưởng.

11:41.980 --> 11:47.410
Sau đó chúng ta sẽ thực hiện chức năng lưu để lưu lại bộ não của ô tô bất cứ khi nào bạn muốn thoát ứng

11:47.410 --> 11:48.520
dụng và quay lại nó.

11:48.610 --> 11:53.440
Và tất nhiên, vì bạn muốn có thể tải bộ não của chiếc xe của mình khi bạn quay trở lại nó,

11:53.440 --> 11:54.720
hãy quay lại ứng dụng.

11:54.730 --> 12:01.150
Chà, chúng ta sẽ kết thúc bằng cách tạo một hàm tải, hàm này sẽ tải mô hình của bạn sau khi bạn lưu mô hình của mình

12:01.150 --> 12:02.320
bằng chức năng lưu.

12:02.620 --> 12:06.280
Vì vậy, ba chức năng để làm bên trái, nhưng nó sẽ đơn giản.

12:06.280 --> 12:09.990
Và sau đó chúng ta sẽ có phần thú vị nhất của mô-đun đầu tiên này.

12:10.000 --> 12:11.470
Đó là bản demo.

12:11.500 --> 12:13.650
Chúng tôi sẽ xem liệu API có hoạt động hay không.

12:13.660 --> 12:17.980
Chúng tôi sẽ xem liệu chiếc xe có đạt được mục tiêu hay không và chúng tôi sẽ xem chúng tôi có thể cải thiện nó như thế nào.

12:17.980 --> 12:21.670
Và cuối cùng bạn sẽ xây dựng được AI đầu tiên của mình.

12:21.940 --> 12:23.890
Vì vậy, tôi không thể chờ đợi để bắt đầu bản demo.

12:23.920 --> 12:25.810
Trước tiên, hãy thực hiện ba chức năng này.

12:25.810 --> 12:27.130
Và cho đến khi đó, hãy tận hưởng.

12:27.130 --> 12:27.670
TÔI.
