Xin chào và chào mừng bạn đến với hướng dẫn Python này.
Trong hướng dẫn này, chúng ta sẽ thực hiện bước đầu tiên để triển khai mô hình học sâu.
Vì vậy, về cơ bản chúng ta sắp triển khai toàn bộ quy trình của thuật toán học sâu.
Và vì vậy chúng tôi sẽ sử dụng những gì chúng tôi đã tạo trước đó.
Đó là kiến trúc của mạng nơ-ron để phát lại bộ nhớ, để tích hợp điều này vào toàn bộ quá
trình học sâu.
Và toàn bộ thuật toán học sâu này sẽ phù hợp với một lớp học.
Vì vậy, đó là lớp cuối cùng chúng tôi đang thực hiện để triển khai trí tuệ nhân tạo.
Và lớp này sẽ chỉ chứa các chức năng khác nhau.
Vì vậy, chúng ta sẽ có các hàm init sẽ tạo và khởi tạo tất cả các biến được gắn với các đối tượng
học sâu trong tương lai của chúng ta, chúng sẽ đại diện cho chính mô hình học sâu và sẽ có
một số hàm khác.
Tất nhiên, một trong số chúng sẽ là chọn hành động phù hợp tại mỗi thời điểm.
Chúng tôi cũng sẽ có một chức năng cập nhật, một chức năng tính điểm để lấy điểm và có một ý tưởng về việc học tập sẽ diễn
ra như thế nào.
Nếu nó diễn ra tốt, nếu quá trình khám phá diễn ra tốt đẹp và nếu nó có thể chuyển sang khai thác, và khi đó
chúng tôi sẽ có một chức năng lưu để lưu mô hình, tức là lưu bộ não của chiếc xe và cuối cùng là
chức năng tải .
Vì vậy, chúng tôi có một số chức năng để thực hiện.
Chúng ta sẽ tạo một hàm cho mỗi hướng dẫn và hôm nay chúng ta sẽ bắt đầu với hàm init như thường lệ
khi chúng ta tạo một lớp học.
Nhưng trước tiên, chúng ta đừng quên giới thiệu lớp, vì vậy chúng ta sẽ gọi nó là D, Q, N cho mạng Q sâu, sau đó là một số dấu ngoặc đơn,
dấu hai chấm, và ở đó chúng ta đi với hàm đầu tiên của chúng ta.
Vì vậy, chúng ta hãy làm điều này def sau đó nhân đôi gạch dưới trong đó, gấp đôi gạch dưới một lần nữa và dấu ngoặc đơn.
Vì vậy, như bạn đã hiểu trong hàm init này, chúng tôi sẽ giới thiệu các biến được gắn với các đối tượng của
chúng tôi.
Vì vậy, chúng ta sẽ có một vài dòng bắt đầu tự nó và về cơ bản chúng ta sẽ tạo và
khởi tạo tất cả các biến cần thiết để triển khai mạng Q sâu.
Vì vậy, ví dụ, chúng tôi sẽ tạo một đối tượng của mạng của chúng tôi vì tất nhiên chúng tôi cần mạng nơ-ron sâu của
chúng tôi, sau đó chúng tôi sẽ cần bộ nhớ của chúng tôi.
Chúng tôi sẽ tạo một biến khác cho bộ nhớ.
Vì vậy, chúng ta sẽ có một biến khác tự là bộ nhớ.
Nhưng đó không phải là tất cả những gì chúng tôi sẽ phải tạo ra.
Một số biến cho trạng thái cuối cùng, phần cuối cùng và phần thưởng cuối cùng.
Đó là tất nhiên, bạn biết đấy, các biến mà bạn thấy trong thuật toán học sâu.
Và sau đó là gì nữa?
Bạn biết đấy, chúng tôi cũng sẽ cần một trình tối ưu hóa để thực hiện giảm độ
dốc ngẫu nhiên để cập nhật các trọng số theo mức độ mà chúng sẽ gây ra lỗi khi AI mắc lỗi.
Và sau đó tôi nghĩ rằng về cơ bản đó là các biến mà bây giờ chúng ta cần để tạo một khởi tạo.
Nhưng trong hàm init này, chúng ta sẽ nhập một vài đối số.
Đầu tiên, như thường lệ, là đối số đề cập đến đối tượng của chúng ta.
Vì bạn biết đấy, chúng ta sẽ tạo một đối tượng của lớp mạng.
Chà, vì lớp mạng nhận làm đối số trong hàm init, đầu vào, kích thước và hành động kết thúc.
Chà, ở đây cũng vậy.
Khi tạo một đối tượng của lớp mạng, chúng ta sẽ cần chọn một đối số kích thước đầu vào trong một đối
số hành động NB.
Vì vậy, chúng tôi chỉ có thể sao chép chúng.
Và.
Đối mặt với chúng ở đây.
Và chúng ta bắt đầu.
Vì vậy, những đối số này bây giờ cũng sẽ trở thành một số đối số của lớp khác nhau.
Bất cứ khi nào chúng tôi tạo một số đối tượng trong tương lai của lớp hiện tại, đó là một số mô hình học sâu trong
tương lai, nơi chúng tôi sẽ cần chỉ định kích thước đầu vào, mà tôi nhắc nhở là số kích thước trong các vectơ đang
mã hóa trạng thái của bạn, trạng thái đầu vào của bạn và một số hành động, là số lượng các hành động có thể
xảy ra mà ô tô có thể thực hiện.
Vì vậy, tôi nhắc nhở những điều này là đi bên trái, đi thẳng hoặc đi bên phải.
Được rồi, hoàn hảo.
Sau đó, bạn biết đấy, chúng ta sẽ tạo một đối tượng của lớp bộ nhớ phát lại để tạo đối tượng bộ nhớ để lấy
bộ nhớ của chúng ta về các quá trình chuyển đổi.
Và trong hàm init, chúng ta có đối số dung lượng, nhưng vì chúng ta sẽ chỉ sử dụng nó một lần nên thực sự
khi chúng ta tạo bộ nhớ chứ không phải ở bất kỳ đâu sau đó, chúng ta sẽ không cần chỉ định đối số dung lượng.
Chúng tôi có thể làm điều này, nhưng chúng tôi sẽ nhập trực tiếp số lượng chuyển đổi mà chúng tôi muốn bộ nhớ của chúng tôi có.
Nhưng sau đó chúng ta cần một đối số ít hơn, đó là tham số gamma trong mô hình học sâu.
Hãy nhớ rằng, tham số gamma này là hệ số trễ.
Đó là tham số của phương trình.
Và do đó chúng tôi sẽ đặt nó ở đây vì chúng tôi sẽ sử dụng nó sau vài lần.
Vì vậy, chúng ta hãy đặt nó ở đây.
Chúng tôi sẽ gọi nó là Gamma.
Vì vậy, đó chỉ là tên của đối số và ở đó, tất cả các đối số sẽ cần cho hàm
init này.
Vì vậy, điều đó có nghĩa là bất cứ khi nào chúng ta tạo mô hình học sâu của mình, đó là bất cứ khi nào chúng ta tạo một đối
tượng mới của lớp hiện tại.
Chà, chúng ta sẽ cần chỉ định dưới dạng các đối số là kích thước đầu vào, số lượng hành động và tham số gamma, và chúng ta
sẽ sớm nhập các giá trị thực cho chúng.
Được rồi.
Vì vậy, bây giờ chúng ta hãy đi vào bên trong hàm init.
Được chứ.
Vì vậy, bây giờ về cơ bản điều này sẽ được dễ dàng.
Chúng tôi sắp tạo một khởi tạo, tất cả các biến mà chúng tôi cần.
Và vì vậy hãy bắt đầu với cái đầu tiên.
Hãy bắt đầu với gamma thực sự là hệ số trễ.
Vì vậy, vì đây là một biến, chúng ta muốn được gắn vào đối tượng của chúng ta, chúng ta bắt đầu với self.
Vì vậy, gamma sẽ là một biến số của mô hình hiện tại của chúng tôi.
Vì vậy, gamma tương đương với các đối số sẽ được đưa vào khi tạo một đối tượng của lớp.
Vì vậy, gamma và ở đó chúng ta đi với đối số thứ hai.
Vì vậy, đối số thứ hai sẽ là cửa sổ phần thưởng.
Vậy cửa sổ phần thưởng này là gì?
Chà, đó sẽ là cửa sổ trượt về giá trị trung bình của 100 phần thưởng cuối cùng, mà chúng tôi sẽ sử dụng
chỉ để đánh giá sự phát triển của hiệu suất AI.
Bạn biết đấy, chúng tôi sẽ có ý nghĩa của phần thưởng trong cửa sổ phần thưởng này sẽ trượt theo thời gian.
Và những gì chúng tôi muốn quan sát là giá trị trung bình của 100 phần thưởng cuối cùng tăng dần theo thời gian.
Vì vậy, hãy khởi tạo nó với phần thưởng tự chấm, cửa sổ gạch dưới.
Và vì đây sẽ là một cửa sổ trượt về giá trị trung bình đang phát triển của 100 phần thưởng cuối cùng, nên chúng tôi sẽ
khởi tạo nó dưới dạng một danh sách trống và sau đó chúng tôi sẽ thêm giá trị trung bình của phần thưởng theo thời gian.
Được rồi, thú vị hơn.
Hãy tạo mạng nơ-ron của chúng ta.
Vì vậy, chúng tôi sẽ gọi nó là mô hình tự chấm, vì về cơ bản đó là trung tâm của mô hình.
Vì vậy, tôi gọi nó là mô hình.
Và mô hình này sẽ không là gì khác hơn là một đối tượng của lớp mạng.
Và để tạo một đối tượng như vậy, chúng ta lấy mạng lớp của chúng ta, sau đó là dấu ngoặc, và ở đây chúng ta chỉ
nhập các đối số của lớp mạng.
Nhưng chúng tôi đặt các đối số này trong các đối số của hàm init và do đó chúng tôi chỉ
cần sao chép chúng ngay tại đây và chỉ cần dán chúng vào lớp mạng.
Và chúng ta bắt đầu.
Với dòng mã này, chúng tôi tạo ra một mạng nơ-ron cho mô hình học sâu của mình.
Hoàn hảo.
Sau đó, chúng ta hãy tạo một bộ nhớ.
Vì vậy, một lần nữa, chúng ta sẽ tạo một biến mới mà chúng ta gọi là bộ nhớ tự chấm.
Và một lần nữa, đây sẽ là một đối tượng của lớp bộ nhớ phát lại.
Vì vậy, chúng ta hãy chỉ lấy tên của lớp của chúng ta, hãy sao chép nó, hãy dán nó vào đây.
Và trong một số dấu ngoặc đơn, chúng ta cần nhập dung lượng vì dung lượng là một đối số của hàm init và đó
là đối số duy nhất chúng ta cần nhập ở đây.
Vậy chúng ta sẽ chọn công suất nào?
Hãy nhớ rằng điều đó tương ứng với số lần chuyển đổi, số lượng sự kiện, ít trạng thái hơn, trạng thái mới, ít
hành động hơn và ít phần thưởng hơn.
Và vì vậy, như đã đề cập trong một trong các hướng dẫn trước, chúng ta sẽ đưa 100.000, 100.000 chuyển đổi vào bộ nhớ, sau đó chúng
tôi sẽ lấy mẫu từ bộ nhớ này để lấy một số lượng nhỏ các chuyển đổi ngẫu nhiên và
đó là mô hình sẽ học.
Được chứ.
Vì vậy, bây giờ chúng tôi có bộ nhớ của chúng tôi.
Hoàn hảo.
Bây giờ hãy lấy trình tối ưu hóa của chúng tôi.
Vì vậy, một lần nữa, tự chúng tôi tạo một biến mới mà chúng tôi gọi là trình tối ưu hóa.
Vì vậy, Trình tối ưu hóa là một biến khác của GQ trong tương lai của chúng ta, một đối tượng tự là trình tối ưu hóa.
Và bây giờ nếu chúng tôi quay trở lại, bạn có thể thấy rằng chúng tôi đã nhập ngọn đuốc đó là Optim, là một mô-đun của ngọn đuốc chứa
tất cả các công cụ để thực hiện giảm độ dốc ngẫu nhiên.
Vì vậy, tất nhiên nó chứa một số trình tối ưu hóa và chúng tôi đã cho nó tối ưu hóa phím tắt và do đó ở
đây những gì chúng tôi sẽ làm là lấy mô hình Optim là ngọn đuốc mà Optim và từ mô-đun này, chúng tôi sẽ lấy một trong
các trình tối ưu hóa.
Vì vậy, như bạn có thể thấy, tất cả chúng đều được liệt kê ở đây.
Nhiều người trong số họ là xuất sắc.
Ví dụ, cánh tay chống là một trình tối ưu hóa tuyệt vời.
Đó là, ví dụ, rất được khuyến khích cho các mạng nơ-ron thông thường hoặc học sâu không giám sát.
Nhưng cái khác tuyệt vời và chúng tôi sẽ chọn là trình tối ưu hóa nguyên tử.
Đó là cái bạn sẽ thấy rằng với cái này bạn sẽ có được một chiếc xe tự lái tốt.
Nhưng một lần nữa, bạn hoàn toàn được hoan nghênh để thử những cái khác.
Bạn có thể thử các cánh tay chống, nhưng đối với mô hình của chúng tôi, chúng tôi sẽ chọn nguyên tử.
Vì vậy, tôi nhấn enter và trên thực tế, bạn nhận thấy có chữ A viết hoa ở đây.
Đó là bởi vì chúng ta đang tạo một đối tượng của lớp nguyên tử.
Đây là một lớp, nhưng bản thân đối tượng sẽ là một trình tối ưu hóa nguyên tử.
Nhưng vì đây là một lớp, chúng ta cần nhập một số đối số.
Các đối số của lớp nguyên tử và các đối số là tất cả các tham số có thể tùy chỉnh trình tối ưu hóa nguyên
tử của bạn.
Vì vậy, ví dụ, đó thường là tốc độ học tập, phân rã hoặc một số thông số khác.
Và bên cạnh việc lấy tất cả các tham số của mô hình của chúng tôi, chúng tôi sẽ chỉ định một tỷ lệ học tập.
Vì vậy, nói về các tham số của mô hình của chúng tôi, chúng tôi có thể lấy chúng bằng mô hình tự chấm.
Vì vậy, đó là mô hình chúng tôi đã tạo ở đây, mô hình tự học từ lớp mạng của chúng tôi.
Vì vậy, mô hình tự học.
Và sau đó để đánh giá các tham số của mô hình, chúng ta thêm một dấu chấm khác và sau đó là các tham số với một số dấu ngoặc đơn
rất đơn giản.
Vì vậy, đó chỉ là kết nối trình tối ưu hóa nguyên tử với mạng nơ-ron của chúng tôi, mạng mà chúng tôi đã tạo ở đây.
Và sau đó, như chúng ta vừa đề cập, chúng ta sẽ thêm một tốc độ học và đối số cho
điều này là l r và chúng ta sẽ đặt nó bằng một giá trị sao cho việc học không diễn ra quá nhanh.
Nếu chúng ta nhận được tỷ lệ học tập quá lớn, thì AI sẽ không học đúng cách.
Chúng tôi muốn cho AI của mình một khoảng thời gian để khám phá, học hỏi từ những sai lầm của nó.
Bạn biết đấy, khi chúng tôi trừng phạt nó, khi nó mắc một số lỗi, chẳng hạn như đi lên cát
hoặc đến quá gần bức tường, chúng tôi muốn cho AI một thời gian để học hỏi.
Chúng tôi muốn đợi mạng nơ-ron cập nhật chính xác.
Và vì vậy, một giá trị tốt cho tỷ lệ học tập mà tôi đã nhận được sau khi thử một vài trong số chúng là 0. 01 cái.
Được rồi.
Và đó là tất cả những gì chúng ta cần để tạo một trình tối ưu hóa.
Vì vậy, về cơ bản chúng ta đang tạo một đối tượng của lớp nguyên tử.
Tuyệt quá.
Và sau đó ba biến cuối cùng mà chúng ta cần là các biến tạo nên các sự kiện chuyển đổi của chúng ta.
Vì vậy, đó là trạng thái cuối cùng, phần cuối cùng và phần thưởng cuối cùng.
Và về cơ bản đó là những gì chúng ta sẽ tạo bây giờ và chúng ta sẽ chỉ cần khởi tạo chúng.
Vì vậy, hãy bắt đầu với buổi hẹn hò cuối cùng.
Ngày cuối cùng chúng ta sẽ gọi nó là ngày tự chấm, trạng thái gạch dưới cuối cùng và sau đó chúng ta sẽ khởi tạo nó như thế
nào?
À, hãy nhớ rằng, trạng thái cuối cùng là một vectơ có năm chiều, một vectơ đang mã hóa một trạng thái
của môi trường.
Và xin nhắc lại, năm kích thước này là ba tín hiệu của ba cảm biến
trái, thẳng và phải, định hướng và định hướng trừ.
Vì vậy, đây là một vectơ theo nghĩa trực quan, nhưng đối với PyTorch, nó cần nhiều hơn một vectơ.
Nó thực sự cần phải là một ngọn đuốc căng.
Nhưng nó không chỉ cần là một máy căng đuốc, mà nó còn cần phải có thêm một chiều nữa mà
tôi thích gọi là chiều giả tương ứng với lô.
Và đó là bởi vì trạng thái cuối cùng sẽ là đầu vào của mạng nơ-ron.
Nhưng khi làm việc với mạng nơ-ron nói chung, dù là với TensorFlow carry hay PyTorch, thì các
vectơ đầu vào không thể là một vectơ đơn giản.
Nó phải được trong một đợt.
Mạng chỉ có thể chấp nhận hàng loạt các quan sát đầu vào và do đó không chỉ chúng ta sẽ tạo một tensor cho
các vectơ trạng thái đầu vào, mà chúng ta cũng sẽ tạo thứ nguyên giả này tương ứng với lô.
Vì vậy, hãy làm điều này và bắt đầu bằng cách khởi tạo một tensor ngọn đuốc.
Vì vậy, để làm được điều này, không có gì đơn giản hơn.
Chúng tôi sử dụng thư viện ngọn đuốc của chúng tôi, sau đó chấm, và sau đó chúng tôi sẽ sử dụng lớp tensor vì như bạn có thể đoán,
điều này sẽ tạo ra một đối tượng mới của lớp tensor là một đối tượng tensor.
Và trong lớp tensor này.
Chúng ta cần nhập một đối số sẽ chỉ định kích thước của tensor của bạn.
Bạn có thể hình dung một tensor giống như một mảng có một kiểu duy nhất.
Nhưng về cơ bản những gì sẽ đại diện bây giờ, tất nhiên là trạng thái đầu vào này, bạn có thể xem nó như một vectơ.
Và do đó, để xác định số phần tử tensor này phải có.
Tất nhiên, chúng ta cần sử dụng kích thước đầu vào, vì kích thước đầu vào chính xác là số kích
thước của các vectơ trạng thái đầu vào của chúng ta.
Bây giờ tôi nên nói cảm biến.
Và vì vậy, những gì chúng ta chỉ cần nhập vào lớp tensor của chúng ta để tạo đối tượng tensor.
Đó là kích thước đầu vào.
Và sau này, kích thước đầu vào sẽ bằng năm.
Được rồi, vậy là tốt rồi.
Đó là điều đầu tiên được thực hiện.
Chúng tôi vừa khởi tạo một tensor, như nó phải như vậy.
Nhưng sau đó, hãy nhớ rằng, chúng ta cần phải làm một điều khác.
Chúng ta cần tạo ra thứ nguyên giả đó, bởi vì đây là thứ mà mạng sẽ mong đợi cho các đầu
vào của nó và để tạo ra một thứ nguyên duy nhất này, nhân tiện, phải là thứ nguyên đầu tiên.
Bạn biết đấy, thứ nguyên giả tương ứng với lô sẽ là thứ nguyên đầu tiên của biến cuối cùng này.
Để làm điều này, chúng ta chỉ cần thêm dấu chấm sau đó và bóp.
Và sau đó trong một số dấu ngoặc đơn, chúng ta cần nhập chỉ số của thứ nguyên mơ hồ này.
Và như tôi vừa nói, chiều giả này phải là chiều đầu tiên của trạng thái.
Và vì các chỉ mục trong Python bắt đầu bằng 0, chúng ta cần nhập 0 để thứ nguyên mới này trở thành thứ
nguyên đầu tiên.
Vì vậy, chúng ta có thứ nguyên đầu tiên tương ứng với lô và sau đó là thứ nguyên tương ứng với tensor,
thứ nguyên này sẽ chứa năm phần tử của trạng thái đầu vào của bạn.
Có ba định hướng tín hiệu và định hướng trừ.
Và sau đó chúng tôi bắt đầu, chúng tôi khởi tạo các trạng thái đầu vào của chúng tôi một cách hoàn hảo.
Và sau đó hai biến để đi.
Và điều đó sẽ dễ dàng hơn nhiều vì biến tiếp theo là hành động cuối cùng.
Vì vậy, đó là một biến mới mà chúng tôi đã tạo cho hành động cuối cùng của đối tượng của chúng tôi.
Và hãy nhớ rằng, trong hướng dẫn đầu tiên của phần này, tôi đã nói với bạn rằng các hành động sẽ
bằng không một hoặc hai và sau đó sử dụng vectơ xoay hai hành động, chúng tôi sẽ chuyển đổi các chỉ mục của
các hành động này thành các góc quay, mà tôi nhắc nhở chúng ta là số 0 20 hoặc -20.
Chúng tôi thực sự có thể làm mới bộ nhớ của mình với điều đó.
Chà, nó chính xác ở đây.
Hành động thông qua xoay.
Nếu hành động bằng 0, tốt, điều này sẽ tương ứng với chỉ mục đầu tiên ở đây.
Vì vậy, số không, nếu hành động là một, điều này sẽ tương ứng với chỉ mục, một trong các vectơ này.
Vì vậy, 20 độ.
Và nếu hành động là hai, chúng ta sẽ nhận được -20 độ.
Đó sẽ là góc quay của chiếc xe của chúng ta khi chúng ta chơi hành động.
Được rồi.
Và do đó, vì hành động sẽ bằng không một hoặc hai, nên hành động do đó là một
số đơn giản.
Và rất đơn giản, chúng ta có thể khởi tạo nó bằng 0.
Chúng tôi không cần tạo bất kỳ tensor nào ở đây hay bất kỳ thứ gì khác.
Chúng ta chỉ cần khởi tạo nó bằng 0.
Và cuối cùng, đó là phần thưởng cuối cùng.
Vì vậy, tự chấm phần thưởng cuối cùng.
Chúng ta bắt đầu.
Và một lần nữa, phần thưởng là một số thực, mà tôi nhắc nhở là giữa trừ một và cộng một.
Vì vậy, đó là con số một lần nữa.
Và đối với hành động, chúng ta sẽ khởi tạo nó bằng 0 và chúng ta bắt đầu.
Xin chúc mừng là chức năng init đã sẵn sàng.
Vì vậy, bây giờ chúng tôi đã sẵn sàng để chuyển sang những thứ thú vị.
Và thực ra, điều quan trọng nhất đối với tôi đó là quyết định hành động nào sẽ chơi tại mỗi thời điểm, mỗi thời điểm.
T Và đó chính xác là những gì chúng ta sẽ làm trong hướng dẫn tiếp theo bằng cách tạo Phương thức Hành động Chọn.
Vì vậy, chúng ta hãy làm điều này trong hướng dẫn tiếp theo.
Và cho đến khi đó, hãy tận hưởng tôi.