업스테이지 과정에 들어와서 가장 크게 달라진 것은 스터디를 중심으로 운영된다는 점이었다.
일주일 간 동영상 강의 + 주어진 스터디 과제를 수행하고 주기적으로 스터디 결과를 공유하는 공유회 시간을 갖는다.
순환신경망의 등장
기존의 CNN, DNN의 경우, 고정된 크기의 입출력을 처리하도록 설계되어 이미지분류와 같은 task에서 좋은 성능을 보여줬음
텍스트, 음성, 주가와 같은 시퀀스 데이터를 다루기 위해 과거의 정보를 기억하면서 가변적인 현재의 입력도 동시에 처리할 필요성이 생김
→ 이런 배경에 따라 순환신경망(Recurrent Neural Network, RNN)이 등장
RNN
이전 시점의 정보를 현재 시점의 입력과 같이 처리하는 순환 구조가 핵심
순환 구조를 통해 rnn은 시퀀스내의 정보를 기억할 수 있음
hidden state는 rnn의 핵심적인 요소로, 네트워크가 시간에 따라 어떤 정보를 기억할지 결정
지금까지의 one to one 구조에서 벗어나 여러 구조로 확장시켜 생각해보자
RNN의 구조
RNN의 한계
시퀸스가 길어질수록 앞부분의 정보를 잊는 문제가 발생 - Long-Term Dependency 문제
→ 이를 해결하기 위해 LSTM이나 GRU등이 등장
LSTM(Long Short-Term Memory)
GRU (Gated Rucurrent Unit)
파이토치 소개
Tensor
Tensor란? 데이터 배열을 의미
텐서의 사칙연산 - 원소 단위로
내적 - 1D 단위에서만 가능
행렬 곱 - 앞 행렬의 열과 뒤 행렬의 행의 길이가 같아야 함
Broadcasting - 차원이 다른 두 텐서 혹은 텐서와 스칼라간 연산을 가능하게 해주는 기능(불가능한 경우 존재)
Broadcasting을 이용해 2D와 1D의 연산
Dense tensor : 배열의 모든 위치에 값을 가지는 텐서
Sparse tensor : 0이 아닌 원소와 그 위치를 저장하는 텐서
tensor에 0이 많을 경우 효율적
COO(Coordinate list), CSR/CSC(Compressed Sparse Row/Column) 방식 등 존재
Sparse COO Tensor
인덱스를 별도로 저장해 반복되어 저장하는 값이 발생 → 비효율적
원소에 접근시 인덱스를 찾아야함 → 반복 접근시 성능 저하
Sparse CSR/CSC Tensor
index : 0이 아닌 원소 순서대로 인덱스를 정렬한 배열
pointer : 경계를 표시하는 배열(0~1, 1~2)
rand : 0과 1 사이의 균일한 분포 (Uniform Distribution) 에서 무작위로 생성된 텐서를 반환
randn : 평균이 0이고 표준 편차가 1인 정규 분포(가우시안 분포)에서 무작위로 생성된 텐서를 반환
randint : 주어진 범위 내에서 정수값을 무작위로 선택하여 텐서를 생성 (단, 최솟값을 포함하고, 최댓값은 포함하지 않음)
zeros : 모든 요소가 0인 텐서 반환
ones : 모든 요소가 1인 텐서 반환
full: 모든 요소가 지정된 값인 텐서 반환
eye : 단위 행렬 반환 (※ 단위 행렬이란? 대각선 요소가 1이고, 나머지 요소가 0인 행렬)
tensor : 주어진 데이터를 텐서로 변환. 데이터는 list, tuple, numpy array 등의 형태일 수 있음
from_numpy : numpy array 를 텐서로 변환
as_tensor: 변환 전 데이터와의 메모리 공유(memory sharing)를 사용하므로, 변환 전 데이터 변경 시 변환되어 있는 텐서에도 반영됨
Tensor : float32 type으로 텐서 변환
Indexing 기본 : 대괄호("[ ]")를 통해 이뤄지며, ":" 는 특정 범위의 접근을 의미
index_select : 선택한 차원에서 인덱스에 해당하는 요소만 추출하는 함수
Masking 을 이용한 Indexing : 조건에 따른 텐서의 요소를 사용하기 위한 방법으로 조건에 맞는 요소들만 반환하는 방법
masked_select : 주어진 mask에 해당하는 요소들을 추출하여 1차원으로 펼친 새로운 텐서를 반환하는 함수
take : 주어진 인덱스를 사용하여 텐서에서 요소를 선택하는 함수. 인덱스 번호는 텐서를 1차원으로 늘려졌을 때 기준으로 접근해야함
gather : 주어진 차원에서 인덱스에 해당하는 요소들을 선택하여 새로운 텐서를 반환
size : 텐서의 모양을 확인
reshape : 텐서의 모양을 변경합니다. 메모리를 공유하지 않음
view : 텐서의 모양을 변경
transpose : 텐서의 차원을 전치
permute : 텐서 차원의 순서를 재배열
unsqueeze : 텐서에 특정 차원에 크기가 1인 차원을 추가
squeeze : 텐서에 차원의 크기가 1인 차원을 제거
expand : 텐서의 값을 반복하여 크기를 확장
repeat : 텐서를 반복하여 크기를 확장
flatten : 다차원 텐서를 1차원 텐서로 변경
ravel : 다차원 텐서를 1차원 텐서로 변경
모양 변경 : view vs. reshape vs. unsqueeze
차원 변경 : transpose vs. permute
반복을 통한 텐서 크기 확장 : expand vs. repeat
cat : 주어진 차원을 따라 텐서들을 연결
stack : 주어진 차원을 새로운 차원으로 추가하여 텐서들을 쌓음
chunk : 나누고자 하는 텐서의 개수를 지정하여 원래의 텐서를 개수에 맞게 분리
split : 입력한 크기로 여러 개의 작은 텐서로 나눔
add : 텐서 간의 덧셈을 수행(+)
sub : 텐서 간의 뺄셈을 수행 (-)
mul : 텐서 간의 곱셈을 수행 (*)
div : 텐서 간의 나눗셈을 수행 (/)
sum : 텐서의 원소들의 합을 반환
mean : 텐서의 원소들의 평균을 반환
max : 텐서의 원소들의 가장 큰 값을 반환
min : 텐서의 원소들의 가장 작은 값을 반환
argmax : 텐서의 원소들의 가장 큰 값의 위치 반환
argmin : 텐서의 원소들의 가장 작은 값의 위치 반환
dot : 벡터의 내적 (inner product) 반환
matmul : 두 텐서 간의 행렬곱 반환 ※ 원소 곱과 다름 주의❗
sparse_coo_tensor : COO 형식의 sparse tensor 를 생성하는 함수
to_sparse_csr : Dense tensor를 CSR 형식의 Sparse tensor로 변환하는 함수
to_sparse_csc : Dense tensor를 CSC 형식의 Sparse tensor로 변환하는 함수
sparse_csr_tensor : CSR 형식의 Sparse tensor 를 생성하는 함수
sparse_csc_tensor : CSC 형식의 Sparse tensor 를 생성하는 함수
to_dense() : sparse tensor 를 dense tensor 로 만드는 함수
2차원 sparse tensor 간에는 일반 텐서와 동일하게 사칙연산 함수들과 행렬곱을 사용할 수 있음
3차원 sparse tensor 에는 일반 텐서와 동일하게 사칙연산 함수들은 사용 가능하지만 행렬곱을 사용할 수 없음
이는 sparse tensor 와 sparse tensor 간에도 적용이 되고, sparse tensor 와 dense tensor 간의 연산에도 적용 됨
slicing (":" 을 사용)은 불가능