본문 바로가기
자연어 처리

[딥러닝을 이용한 자연어 처리 입문] 벡터와 행렬 연산

by 나연하야 2023. 4. 16.

텐서

1. 벡터와 행렬과 텐서

- 벡터는 숫자가 나열된 형상이며, 파이썬에서는 1차원 배열 또는 리스트로 표현함

- 행렬은 행과 열을 가지는 2차원 형상을 가진 구조임

- 3차원부터는 주로 텐서라고 부름

 

2. 텐서

- 0차원부터 3차원 텐서는 아래와 같이 표현됨

import numpy as np

# 0차원 텐서(스칼라)
d1 = np.array(5)
print('d1의 차원 :',d1.ndim)
print('d1의 크기(shape) :',d1.shape)

# 1차원 텐서(벡터)
d2 = np.array([1,2,3,4])
print('d2의 차원 :',d2.ndim)
print('d2의 크기(shape) :',d2.shape)

# 2차원 텐서(행렬)
d3 = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
print('d3의 차원 :',d3.ndim)
print('d3의 크기(shape) :',d3.shape)

# 3차원 텐서(다차원 배열)
d4 = np.array([[[1,2,3,4], [5,6,7,8], [9,10,11,12]], [[1,2,3,4], [5,6,7,8], [9,10,11,12]]])
print('d4의 차원 :',d4.ndim)
print('d4의 크기(shape) :',d4.shape)
d1의 차원 : 0
d1의 크기(shape) : ()
d2의 차원 : 1
d2의 크기(shape) : (4,)
d3의 차원 : 2
d3의 크기(shape) : (3, 4)
d4의 차원 : 3
d4의 크기(shape) : (2, 3, 4)

 

- 자연어 처리에서 주로 보게 되는 것은 '3차원 텐서'이며, (samples, timesteps, word_dim)임

- 일괄로 처리하기 위해 데이터를 묶는 단위인 배치의 개념에서는 (batch_size, timesteps, word_dim)임

- 여기서 samples 또는 batch_size는 샘플의 개수, timesteps는 시퀀스의 길이, word_dim은 단어를 표현하는 벡터의 차원을 의미함

 

예시)

문서1: I like NLP

문서2: I like DL

문서3: DL is AI

- 위의 문서1, 2, 3에서 사용된 단어를 원-핫 인코딩하여 벡터로 표현하면 아래와 같음

단어 One-hot vector
I [1 0 0 0 0 0]
like [0 1 0 0 0 0]
NLP [0 0 1 0 0 0]
DL [0 0 0 1 0 0]
is [0 0 0 0 1 0]
AI [0 0 0 0 0 1]

- 위의 문서 1, 2, 3을 텐서 형태로 표현하면 다음과 같음 -> 크기: (3,3,6)

[[[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0]],
[[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]],
[[0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1]]]

 

3. 케라스에서의 텐서

- 케라스에서는 신경망의 층에 입력의 크기(shape)를 인자로 줄 때 input_shape를 사용함

- 예를 들어 input_shape(6,5)라는 인자값을 사용한다면 이 텐서의 크기는 (?, 6, 5)를 의미함

- 만약 배치 크기까지 지정해주고 싶으면 batch_input_size=(8,2,10)과 같이 지정해주면 됨

 

벡터와 행렬의 연산

1. 벡터의 내적

A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
print('두 벡터 의 내적 :',np.dot(A, B))

두 벡터 의 내적 : 32

 

2. 벡터의 행렬 곱

A = np.array([[1, 3],[2, 4]])
B = np.array([[5, 7],[6, 8]])
print('두 행렬의 행렬 곱 :')
print(np.matmul(A, B))

두 행렬의 행렬 곱 :
[[23 31]
 [34 46]]

 

다중 선형 회귀 행렬 연산으로 이해하기

- 데이터의 샘플과 특성은 아래와 같음

- H(X)=WX+B를 행렬로 표현하면 아래와 같음

출처: 유원준/안상준, 딥러닝을 이용한 자연어 처리 입문-1권, p209-p221.