tek4

Reduction Và Access Operations Trong Pytorch

by - September. 21, 2021
Kiến thức
Machine Learning
Python
<p><img style="width: 639px; display: block; margin-left: auto; margin-right: auto;" src="http://tek4vn.2soft.top/public_files/reduction-va-access-operations-png-1" alt="Reduction V&agrave; Access Operations" height="334" /></p> <h3 class="section-heading" style="text-align: justify;">Reduction Operations</h3> <p style="text-align: justify;">H&atilde;y bắt đầu mọi thứ bằng c&aacute;ch đưa ra định nghĩa&nbsp;reduction operation.</p> <pre><code>A reduction operation on a tensor is an operation that reduces the number of elements contained within the tensor.</code></pre> <p style="text-align: justify;">Hiểu một c&aacute;ch đơn giản th&igrave;&nbsp;<em>reduction operation&nbsp;</em>&nbsp;l&agrave; một ph&eacute;p to&aacute;n l&agrave;m giảm số phần tử c&oacute; trong tensor.</p> <p style="text-align: justify;">Cho đến nay trong loạt b&agrave;i n&agrave;y, ch&uacute;ng ta đ&atilde; biết rằng tensors l&agrave; cấu tr&uacute;c dữ liệu của Deep learning.&nbsp;Nhiệm vụ của ch&uacute;ng ta l&agrave; load c&aacute;c phần tử dữ liệu của ch&uacute;ng ta v&agrave;o một tensor.</p> <p style="text-align: justify;">V&igrave; l&yacute; do n&agrave;y, tensors l&agrave; cực kỳ quan trọng, nhưng cuối c&ugrave;ng, những g&igrave; ch&uacute;ng ta đang l&agrave;m với c&aacute;c operation m&agrave; ch&uacute;ng ta đ&atilde; học trong loạt b&agrave;i n&agrave;y l&agrave; quản l&yacute; c&aacute;c phần tử dữ liệu c&oacute; trong tensors.</p> <pre><code>Tensors give us the ability to manage our data - Tensors cung cấp cho ch&uacute;ng ta khả năng quản l&yacute; dữ liệu của m&igrave;nh.</code></pre> <p style="text-align: justify;">Reshaping&nbsp;cho ch&uacute;ng ta khả năng định vị c&aacute;c phần tử theo c&aacute;c axes cụ thể.&nbsp;Element-wise&nbsp;cho ph&eacute;p ch&uacute;ng ta thực hiện c&aacute;c ph&eacute;p to&aacute;n tr&ecirc;n c&aacute;c phần tử giữa hai tensor&nbsp;v&agrave; <em>reduction</em> cho ph&eacute;p ch&uacute;ng ta thực hiện c&aacute;c ph&eacute;p to&aacute;n tr&ecirc;n c&aacute;c phần tử trong một tensor duy nhất.</p> <p style="text-align: justify;">H&atilde;y xem một v&iacute; dụ dưới đ&acirc;y.</p> <h4 class="sub-section-heading" style="text-align: justify;">V&iacute; dụ về reduction operation</h4> <p style="text-align: justify;">Giả sử ch&uacute;ng ta l&agrave; tensor 3 x 3 rank-2 sau:</p> <pre class="language-python"><code>&gt; t = torch.tensor([ [0,1,0], [2,0,2], [0,3,0] ], dtype=torch.float32)</code></pre> <p style="text-align: justify;">H&atilde;y xem reduction operation đầu ti&ecirc;n, <em>sum():</em></p> <pre class="language-python"><code>&gt; t.sum() tensor(8.)</code></pre> <p style="text-align: justify;">Tổng c&aacute;c th&agrave;nh phần v&ocirc; hướng của tensor được t&iacute;nh bằng phương thức tensor <em>sum().&nbsp;</em>Kết quả cho ra l&agrave; một tensor c&oacute; gi&aacute; trị v&ocirc; hướng.</p> <p style="text-align: justify;">Kiểm tra số lượng phần tử trong tensor ban đầu so với kết quả của lệnh gọi <em>sum().</em></p> <pre class="language-python"><code>&gt; t.numel() 9 &gt; t.sum().numel() 1</code></pre> <p style="text-align: justify;">C&oacute; thể thấy:</p> <pre class="language-python"><code>&gt; t.sum().numel() &lt; t.numel() True</code></pre> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể thấy rằng, thực tế tensor được trả về bởi lệnh gọi <em>sum()</em> chứa &iacute;t phần tử hơn ban đầu.</p> <p style="text-align: justify;">V&igrave; số lượng phần tử đ&atilde; được giảm bớt, ch&uacute;ng ta c&oacute; thể kết luận rằng phương thức <em>sum()</em> l&agrave; một reduction operation.</p> <h4 class="sub-section-heading" style="text-align: justify;">C&aacute;c reduction operations th&ocirc;ng dụng</h4> <p style="text-align: justify;">Dưới đ&acirc;y l&agrave; một số h&agrave;m&nbsp;reduction th&ocirc;ng dụng kh&aacute;c:</p> <pre class="language-python"><code>&gt; t.sum() tensor(8.) &gt; t.prod() tensor(0.) &gt; t.mean() tensor(.8889) &gt; t.std() tensor(1.1667)</code></pre> <p style="text-align: justify;">Tất cả c&aacute;c h&agrave;m n&agrave;y đều l&agrave;m giảm số phần tử của tensor về một phần tử v&ocirc; hướng duy nhất.</p> <p style="text-align: justify;">C&aacute;c ph&eacute;p to&aacute;n reduction operations n&oacute;i chung,&nbsp;cho ph&eacute;p ch&uacute;ng ta t&iacute;nh to&aacute;n c&aacute;c gi&aacute; trị tổng hợp (tổng số) tr&ecirc;n c&aacute;c cấu tr&uacute;c dữ liệu. Trong trường hợp n&agrave;y, cấu tr&uacute;c l&agrave; tensor.</p> <p style="text-align: justify;">C&acirc;u hỏi đặt ra l&agrave;: C&aacute;c ph&eacute;p to&aacute;n reduction c&oacute; l&agrave;m giảm số phần tử của tensor về một phần tử duy nhất hay kh&ocirc;ng?</p> <p style="text-align: justify;">C&acirc;u trả lời l&agrave; kh&ocirc;ng!</p> <p style="text-align: justify;">Trong thực tế, ch&uacute;ng ta thường giảm c&aacute;c axes cụ thể tại một thời điểm.&nbsp;Qu&aacute; tr&igrave;nh n&agrave;y l&agrave; quan trọng.</p> <h4 class="sub-section-heading" style="text-align: justify;">Reducing Tensors theo axes</h4> <p class="sub-section-heading" style="text-align: justify;">Để reduction Tensors theo axis cụ thể, ch&uacute;ng ta sử dụng c&aacute;c phương ph&aacute;p tương tự như flatten v&agrave; ch&uacute;ng ta chỉ truyền một gi&aacute; trị cho tham số&nbsp;dimension (dim).</p> <p style="text-align: justify;">V&iacute; dụ, giả sử ch&uacute;ng ta c&oacute; tensor sau:</p> <pre class="language-python"><code>&gt; t = torch.tensor([ [1,1,1,1], [2,2,2,2], [3,3,3,3] ], dtype=torch.float32)</code></pre> <p style="text-align: justify;">Đ&acirc;y l&agrave; tensor 3 x 4 rank-2.</p> <p style="text-align: justify;">H&atilde;y xem x&eacute;t lại phương thức <em>sum().&nbsp;</em>Lần n&agrave;y, ch&uacute;ng ta sẽ truyền v&agrave;o 1 dimention để&nbsp;reduce. Ch&uacute;ng ta c&oacute; 2 axes n&ecirc;n ch&uacute;ng ta sẽ l&agrave;m cả 2.</p> <p style="text-align: justify;">Kết quả:</p> <pre class="language-python"><code>&gt; t.sum(dim=0) tensor([6., 6., 6., 6.]) &gt; t.sum(dim=1) tensor([ 4., 8., 12.])</code></pre> <p style="text-align: justify;">H&atilde;y xem những g&igrave; đ&atilde; xảy ra với kết quả tr&ecirc;n.</p> <p style="text-align: justify;">Đối với axis đầu ti&ecirc;n(dim=0). Khi t&iacute;nh tổng l&agrave;&nbsp;ch&uacute;ng ta đang t&iacute;nh tổng c&aacute;c phần tử của axis đầu ti&ecirc;n. N&oacute; diễn ra như sau:</p> <pre class="language-python"><code>​&gt; t[0] tensor([1., 1., 1., 1.]) &gt; t[1] tensor([2., 2., 2., 2.]) &gt; t[2] tensor([3., 3., 3., 3.]) &gt; t[0] + t[1] + t[2] tensor([6., 6., 6., 6.])</code></pre> <p style="text-align: justify;">C&aacute;c bạn c&oacute; thể thấy ph&eacute;p to&aacute;n element-wise đang diễn ra.</p> <p style="text-align: justify;">Đối với axis thứ 2,&nbsp;ch&uacute;ng ta c&oacute; ba nh&oacute;m bốn số, ch&uacute;ng ta nhận được ba tổng:</p> <pre class="language-python"><code>&gt; t[0].sum() tensor(4.) &gt; t[1].sum() tensor(8.) &gt; t[2].sum() tensor(12.) &gt; t.sum(dim=1) tensor([ 4., 8., 12.])</code></pre> <p style="text-align: justify;">B&acirc;y giờ ch&uacute;ng ta h&atilde;y xem một ph&eacute;p to&aacute;n reduction rất phổ biến được sử dụng trong lập tr&igrave;nh mạng neural c&oacute; t&ecirc;n l&agrave; Argmax.</p> <h4 class="sub-section-heading" style="text-align: justify;">Argmax Tensor Reduction Operation</h4> <p style="text-align: justify;">Argmax (arguments of the maxima&nbsp;)&nbsp;l&agrave; một h&agrave;m to&aacute;n học cho ch&uacute;ng ta biết đối số n&agrave;o, khi được cung cấp cho một h&agrave;m l&agrave;m đầu v&agrave;o, dẫn đến gi&aacute; trị đầu ra tối đa của h&agrave;m.</p> <p style="text-align: justify;">Hay n&oacute;i c&aacute;ch kh&aacute;c:&nbsp;Argmax trả về index của&nbsp; phần tử c&oacute; gi&aacute; trị lớn nhất b&ecirc;n trong một tensor.</p> <p style="text-align: justify;">Khi ch&uacute;ng ta gọi phương thức <em>argmax()</em> tr&ecirc;n tensor, tensor được reduce th&agrave;nh một tensor mới c&oacute; chứa một gi&aacute; trị index của phần tử c&oacute; gi&aacute; trị lớn nhất ở b&ecirc;n trong tensor.</p> <p style="text-align: justify;">V&iacute; dụ, ch&uacute;ng ta c&oacute; tensor sau:</p> <pre class="language-python"><code>t = torch.tensor([ [1,0,0,2], [0,3,3,0], [4,0,0,5] ], dtype=torch.float32)</code></pre> <p style="text-align: justify;">Trong tensor n&agrave;y, ch&uacute;ng ta c&oacute; thể thấy rằng gi&aacute; trị lớn nhất l&agrave; 5 ở vị tr&iacute; cuối c&ugrave;ng của mảng cuối c&ugrave;ng.</p> <p style="text-align: justify;">H&atilde;y xem đoạn code dưới đ&acirc;y:</p> <pre class="language-python"><code>&gt; t.max() tensor(5.) &gt; t.argmax() tensor(11) &gt; t.flatten() tensor([1., 0., 0., 2., 0., 3., 3., 0., 4., 0., 0., 5.])</code></pre> <p style="text-align: justify;">Đoạn code đầu ti&ecirc;n x&aacute;c nhận với ch&uacute;ng ta rằng gi&aacute; trị lớn nhất l&agrave; 5, lệnh gọi phương thức <em>argmax()</em> cho ch&uacute;ng ta biết rằng số 5 đang ở index 11.</p> <p style="text-align: justify;">Ch&uacute;ng ta sẽ xem x&eacute;t đầu ra của tensor đ&atilde; được flatten.&nbsp;Nếu ch&uacute;ng ta kh&ocirc;ng x&aacute;c định một axis cụ thể cho phương thức <em>argmax(),</em> n&oacute; sẽ trả về vị tr&iacute; index của gi&aacute; trị lớn nhất từ tensor đ&atilde; được flatten, trong trường hợp n&agrave;y l&agrave; 11.</p> <p style="text-align: justify;">H&atilde;y xem l&agrave;m thế n&agrave;o ch&uacute;ng ta c&oacute; thể l&agrave;m việc với c&aacute;c axes cụ thể b&acirc;y giờ.</p> <pre class="language-python"><code>&gt; t.max(dim=0) (tensor([4., 3., 3., 5.]), tensor([2, 1, 1, 2])) &gt; t.argmax(dim=0) tensor([2, 1, 1, 2]) &gt; t.max(dim=1) (tensor([2., 3., 5.]), tensor([3, 1, 3])) &gt; t.argmax(dim=1) tensor([3, 1, 3])</code></pre> <p style="text-align: justify;">Ch&uacute;ng ta đang l&agrave;m việc với cả 2 axes của tensor trong đoạn code tr&ecirc;n.&nbsp;Lưu &yacute;,c&aacute;ch gọi phương thức <em>max()</em> trả về hai tensor. Tensor đầu ti&ecirc;n&nbsp;chứa c&aacute;c gi&aacute; trị lớn nhất v&agrave; tensor thứ 2 chứa c&aacute;c vị tr&iacute; index tương ứng cho c&aacute;c gi&aacute; trị lớn nhất.</p> <p style="text-align: justify;">C&aacute;c gi&aacute; trị argmax ở đ&acirc;y, cho biết chỉ số b&ecirc;n trong mỗi mảng tương ứng nơi gi&aacute; trị max tồn tại.</p> <p style="text-align: justify;">Trong thực tế, ch&uacute;ng ta thường sử dụng h&agrave;m <em>argmax()</em> tr&ecirc;n tensor dự đo&aacute;n đầu ra của mạng, để x&aacute;c định xem danh mục n&agrave;o c&oacute; gi&aacute; trị dự đo&aacute;n cao nhất.</p> <h3 style="text-align: justify;"><span class="font-weight-bold">Access operations</span></h3> <p style="text-align: justify;">Loại&nbsp;operation&nbsp;phổ biến cuối c&ugrave;ng m&agrave; ch&uacute;ng ta cần đối với tensor l&agrave; khả năng truy cập dữ liệu từ b&ecirc;n trong tensor (access operation).</p> <p style="text-align: justify;">H&atilde;y xem v&iacute; dụ sau, giả sử ch&uacute;ng ta c&oacute; tensor dưới đ&acirc;y:</p> <pre class="language-python"><code>&gt; t = torch.tensor([ [1,2,3], [4,5,6], [7,8,9] ], dtype=torch.float32) &gt; t.mean() tensor(5.) &gt; t.mean().item() 5.0</code></pre> <p style="text-align: justify;">Khi ch&uacute;ng ta gọi gi&aacute; trị trung b&igrave;nh tr&ecirc;n tensor 3 x 3 n&agrave;y, đầu ra giảm xuống l&agrave; một tensor c&oacute; gi&aacute; trị v&ocirc; hướng. Nếu ch&uacute;ng ta muốn nhận gi&aacute; trị dưới dạng số, ch&uacute;ng ta sử dụng phương thức tensor <em>item().</em>&nbsp;Điều n&agrave;y hoạt động đối với c&aacute;c tensor c&oacute; gi&aacute; trị v&ocirc; hướng.</p> <p style="text-align: justify;">H&atilde;y xem c&aacute;ch ch&uacute;ng ta l&agrave;m điều đ&oacute; với nhiều gi&aacute; trị:</p> <pre class="language-python"><code>&gt; t.mean(dim=0).tolist() [4.0, 5.0, 6.0] &gt; t.mean(dim=0).numpy() array([4., 5., 6.], dtype=float32)</code></pre> <p style="text-align: justify;">Khi ch&uacute;ng ta t&iacute;nh gi&aacute; trị trung b&igrave;nh tr&ecirc;n axis đầu ti&ecirc;n, nhiều gi&aacute; trị được trả về v&agrave; ch&uacute;ng ta c&oacute; thể truy cập c&aacute;c gi&aacute; trị số bằng c&aacute;ch chuyển đổi tensor đầu ra th&agrave;nh <em>list</em> của Python hoặc mảng NumPy.</p> <h3 style="text-align: justify;">Kết Luận</h3> <p style="text-align: justify;">Trong b&agrave;i viết tiếp theo ch&uacute;ng ta sẽ bắt đầu đề cập đến dữ liệu trong Deep learning. Hi vọng bạn th&iacute;ch b&agrave;i viết n&agrave;y. Hẹn gặp lại bạn trong phần tiếp theo!</p> <p style="text-align: justify;">&nbsp;</p> <hr /> <p style="text-align: center;"><em><strong>Fanpage Facebook:</strong>&nbsp;<a href="https://www.facebook.com/tek4.vn/">TEK4.VN</a></em>&nbsp;</p> <p style="text-align: center;"><em><strong>Tham gia cộng đồng để chia sẻ, trao đổi v&agrave; thảo luận:</strong>&nbsp;<a href="https://www.facebook.com/groups/tek4.vn/">TEK4.VN - Học Lập Tr&igrave;nh Miễn Ph&iacute;</a></em></p>