Torch (học máy)

**Torch** là một thư viện học máy mã nguồn mở, một framework tính toán khoa học và là một ngôn ngữ kịch bản dựa trên ngôn ngữ lập trình Lua. Nó cung cấp một lượng lớn các thuật toán về học sâu, sử dụng ngôn ngữ kịch bản LuaJIT và ngôn ngữ thực thi C được tạo ra tại IDIAP ở EPFL. Từ năm 2018, Torch không còn được phát triển nữa. Tuy vậy, PyTorch - vốn dựa trên thư viện Torch, thì đang được phát triển từ tháng 10 năm 2022.

## torch
Gói cốt lõi của Torch là `torch`. Nó cung cấp một mảng hay tensor n chiều một cách linh hoạt, hỗ trợ các quy trình cơ bản để index, chuyển vị, truyền, thay đổi kích thước, chia sẻ kho lưu trữ và tạo bản sao (cloning). Tensor cũng hỗ trợ các phép toán như `max`, `min`, `sum`; phân phối thống kê như phân phối đều, phân phối chuẩn và phân phối đa thức; các phép toán BLAS như tích vô hướng, phép nhân ma trận với vector, phép nhân 2 ma trận.

Ví dụ sau đây sử dụng torch thông qua trình biên dịch REPL:

```lua
> a = torch.randn(3,4)

> =a
-0.2381 -0.3401 -1.7844 -0.2615
 0.1411  1.6249  0.1708  0.8299
-1.0434  2.2291  1.0525  0.8465
[torch.DoubleTensor of dimension 3x4]

> a[1][2]
-0.34010116549482

> a:narrow(1,1,2)
-0.2381 -0.3401 -1.7844 -0.2615
 0.1411  1.6249  0.1708  0.8299
[torch.DoubleTensor of dimension 2x4]

> a:index(1, torch.LongTensor{1,2})
-0.2381 -0.3401 -1.7844 -0.2615
 0.1411  1.6249  0.1708  0.8299
[torch.DoubleTensor of dimension 2x4]

> a:min()
-1.7844365427828
```


Gói `torch` cũng đơn giản hóa việc lập trình hướng đối tượng và tuần tự hóa bằng cách cung cấp các chức năng tiện lợi khác nhau. Hàm `torch.class(classname, parentclass)` có thể sử dụng để tạo (lớp) factory method. Khi hàm tạo được gọi, torch khởi tạo và lập một table dạng Lua với metatable do người dùng định nghĩa qua đó table đó trở thành một đối tượng.

Các đối tượng sử dụng torch factory cũng được tuần tự hóa, miễn là chúng không chứa tham chiếu đến các đối tượng không thể tuần tự hóa, như các coroutine dạng Lua và *userdata* dạng Lua. Tuy nhiên, *userdata* có thể tuần tự hóa nếu nằm trong một kiểu table (hay metatable) cung cấp các phương thức `read()` và `write()`.

## nn
Gói `nn` được sử dụng để xây dựng các mạng neuron. Nó được chia thành các đối tượng module dùng chung một `Module` giao diện chung. Các module có phương thức `forward()` và `backward()` cho phép chúng truyền thẳng (feedforward) và truyền ngược (backpropagate) tương ứng. Các module có thể được nối với nhau bằng cách sử dụng module hợp tử, như `Sequential`, `Parallel` và `Concat` để tạo các biểu đồ phức tạp phù hợp. Các module đơn giản như `Linear`, `Tanh` và `Max` tạo thành các module có các thành phần cơ bản. Giao diện module này cung cấp phép vi phân gradient tự động. Sau đây là một ví dụ về trường hợp sử dụng để xây dựng một tri giác đa lớp (MLP) bằng cách sử dụng module:


```lua
> mlp = nn.Sequential()
> mlp:add( nn.Linear(10, 25) ) -- 10 input, 25 unit ẩn
> mlp:add( nn.Tanh() ) -- một số hàm truyền tiếp tuyến hyperbol
> mlp:add( nn.Linear(25, 1) ) -- 1 output
> =mlp:forward(torch.randn(10))
-0.1815
[torch.Tensor of dimension 1]
```


Các hàm mất mát được thực thi như các lớp con của `Criterion`, có giao diện tương tự như `Module`. Nó cũng có phương thức `forward()` và `backward()` để tính toán gradient mất mát và truyền ngược. Hữu ích để đào tạo mạng neuron đối với các yêu cầu không cao cấp. Các mất mát thường được tính qua Sai số toàn phương trung bình (MSE) thực thi trong `MSECriterion` và entropy chéo thực thi trong `ClassNLLCriterion`. Dưới đây là một ví dụ về hàm Lua gọi ra để huấn luyện một module `mlp` khi input tensor `x`, tensor mục tiêu `y` với một biến vô hướng `learningRate`:    

```lua
function gradUpdate(mlp, x, y, learningRate)
  local criterion = nn.ClassNLLCriterion()
  pred = mlp:forward(x)
  local err = criterion:forward(pred, y); 
  mlp:zeroGradParameters();
  local t = criterion:backward(pred, y);
  mlp:backward(x, t);
  mlp:updateParameters(learningRate);
end
```


Ngoài ra, nó cũng có lớp `StochasticGradient` để đào tạo một mạng neuron bằng cách sử dụng thuật Giảm gradient ngẫu nhiên, mặc dù gói `optim` cung cấp nhiều lựa chọn hơn, như động lượng và phân rã trọng lượng chính quy hóa.

## Các gói khác
Nhiều gói khác với các gói đã nêu ở trên được Torch cung cấp. Chúng được liệt kê trong cheetsheet của torch. Các gói bổ sung này cung cấp một loạt các tiện ích như tính song song, đầu vào/đầu ra không đồng bộ, xử lý ảnh, v.v. Dùng LuaRocks để cài đặt, trình quản lý gói Lua cũng được bao gồm trong Torch.

## Ứng dụng
Torch được sử dụng bởi Nhóm nghiên cứu AI của Facebook, IBM, Yandex và Viện nghiên cứu Idiap. Torch cho phép sử dụng rộng rãi trên Android và iOS. Nó được sử dụng để tạo nên các phương pháp thực thi phần cứng cho luồng dữ liệu giống như mạng neuron.

Facebook đã phát hành một bộ module mở rộng dưới dạng phần mềm mã nguồn mở.

## Xem thêm
* So sánh các phần mềm học sâu
* PyTorch

## Tham khảo

## Liên kết ngoài
*