본문 바로가기
소프트웨어/머신러닝

머신러닝 6주차

by 도지선다형 2025. 3. 5.

인공 뉴런 : 단순히 입력이 일정 개수만큼 활성화되었을 때 출력을 내보냄

 

 

퍼셉트론 : 가장 간단한 인공 신경망 구조

  • 퍼셉트론에서 가장 널리 사용되는 계단 함수 -> 헤비사이드 계단함수
  • 퍼셉트론은 하나의 층 안에 놓은 하나 이상의 TLU로 구성
  • 각각의 TLU는 모든 입력에 연결됨 이러한 층을 완전 연결 층 / 밀집 층 이라고 함.
  • 입력은 입력층을 구성
  • TLU의 층이 최종 출력을 생성하기 때문에 이를 출력 층 이라고 함!

💡퍼셉트론의 훈련 알고리즘은 헤브의 규칙에서 영감을 받음.

  • 헤브의 규칙 : 두 뉴런이 동시에 활성화될 때마다 이들 사이의 연결 가중치가 증가하는 경향이 있다.
  • 퍼셉트론은 네트워크가 예측할 때 만드는 오차를 반영하도록 조금 변형된 규칙을 사용하여 훈련된다.

퍼셉트론 수렴 이론 : 훈련 샘플이 선형적으로 구분될 수 있다면 이 알고리즘이 정답에 수렴한다.

 

다층 퍼셉트론 : 퍼셉트론을 여러 개 쌓아올려 일부 제약을 줄일 수 있는 인공 신경망

  • 다층 퍼셉트론은 입력 층 하나와 은닉 층이라 불리는 하나 이상의 TLU층과 출력층으로 구성
  • 입력 층과 가까운 층을 보통 하위 층 이라 부르고 출력에 가까운 층을 상위층이라고 함.
  • 심층 신경망 : 은닉 층을 여러 개 쌓아 올린 인공 신경망

 

후진 모드 자동 미분 : 네트워크를 두 번만 통과하면 모든 단일 모델 파라미터에 대한 신경망 오차의 그레디언트를 계산할 수 있다.

역전파 : 후진 모드 자동 미분과 경사 하강법을 결합한 것

  • 에포크 : 한번에 하나의 미니배치씩 진행해 전체 훈련 세트를 처리함. 이 과정을 여러 번 반복
  • 역전파의 작동 방식 : 미니배치에 대한 예측을 만들고, 오차를 측정함. 그 다음 역방향으로 각 층 거치며 각 연결이 오차에 기여한 정도를 측정함. 마지막으로 이 오차가 감소하도록 가중치와 편향을 조정함.

📌역전파 한줄 요약

오차를 출력층에서 입력층 방향으로 전파하여 가중치를 최적화하는 알고리즘

 

💡역전파에 널리 쓰이는 활성화 함수

  1. tanh 함수(하이퍼볼릭 탄젠트 함수)
  2. ReLU 함수

❗활성화 함수가 왜 필요할까?

  ㄴ 비선형 활성화 함수가 있는 충분히 큰 심층 신경망은 이론적으로 어떤 연속 함수도 근사할 수 있기 때문

 

 

회귀를 위한 다층 퍼셉트론

다층 퍼셉트론은 회귀 작업에 사용될 수 있다. 값 하나 예측하는 데 출력 뉴런은 하나만 필요. 이 뉴런의 출력이 예측된 값.

 

분류를 위한 다층 퍼셉트론

  • 다층 퍼셉트론은 분류 작업에도 사용됨.
  • EX) 이진분류 문제에선 시그모이드 활성화 함수를 가진 하나의 출력 뉴런만 필요함.
  • 확률 분포를 예측해야 하므로 손실 함수에는 일반적으로 크로스 엔트로피 손실을 사용함.

 

케라스 : 모든 종류의 신경망을 손쉽게 만들고 훈련, 평가, 실행할 수 있는 텐서플로의 고수준 딥러닝 API

 

 

 

와이드&딥 신경망

  • 순차적이지 않은 신경망
  • 입력의 일부 또는 전체가 출력 층에 바로 연결
  • 복잡한 패턴과 간단한 규칙을 모두 학습할 수 있음
  • 대조적으로 일반적인 MLP는 네트워크에 있는 층 전체에 모든 데이터를 통과시킴
  • 데이터에 있는 간단한 패턴이 연속된 변환으로 인해 왜곡될 수 있음.

 

 

신경망 하이퍼파라미터 튜닝하기

신경망의 유연성은 단점이기도 함. 조정할 하이퍼파라미터가 많기 때문

 

💡어떤 하이퍼파라미터 조합이 주어진 문제에 최적인지 알 수 있을까?

1. 케라스 모델을 사이킷런 추정기로 변환한 다음 GridSearchCV 또는 RandomizedSearchCV를 사용해 하이퍼파라미터를 미세 튜닝하는 것

2. 케라스 모델을 위한 하이퍼파라미터 튜닝 라이브러리인 케라스 튜너 라이브러리를 사용하는 것(더 좋은 방법)

 

전이 학습 : 첫 번째 신경망의 층에 있는 가중치와 편향 값으로 초기화해 고수준 구조만 학습하는 것

 

입력 층의 뉴런 개수

입력 층과 출력 층의 뉴런 개수는 해당 작업에 필요한 입력과 출력의 형태에 따라 결정.

은닉 층은 일반적으로 각 층의 뉴련을 점점 줄여서 깔때기처럼 구성됨. 저수준의 많은 특성이 고수준의 적은 특성으로 합쳐질 수 있기 때문.

 

스트래치 팬츠 방식 : 필요한 것보다 더 많은 층과 뉴런을 가진 모델을 선택한 다음, 과대적합되지 않도록 조기 종료나 규제 기법을 사용하는 것.

 

 

학습률, 배치 크기 그리고 다른 하이퍼파라미터

  • 학습률 - 일반적으로 최적의 학습률은 최대 학습률의 절반 정도, 가장 중요한 하이퍼파라미터
  • 옵티마이저 - 미니배치 경사 하강법보다 더 좋은 옵티마이저를 선택하는 것도 중요함.
  • 배치 크기 - 모델 성능과 훈련 시간에 큰 영향을 미칠 수 있음.
  • 활성화 함수 - 일반적으로 ReLU 활성화 함수가 모든 은닉 층에 좋은 기본값. 출력 층의 활성화 함수는 수행하는 작업에 따라 달라짐
  • 반복 횟수 - 대부분의 경우 훈련 반복 횟수는 튜닝할 필요가 없음, 대신 조기 종료를 사용함.

 

심층 신경망을 훈련하는 것은 쉬운 일이 아님.. 다음과 같은 문제가 존재

  • 훈련이 극단적으로 느려질 수 있음.
  • 수백만 개의 파라미터를 가진 모델은 훈련 세트에 과대적합될 확률이 매우 큼.
  • 훈련 데이터가 충분하지 않거나 레이블을 만드는 작업에 비용이 너무 많이 들 수 있음.

 

그레이디언트 소실과 폭주 문제

그레이디언트 소실 : 경사 하강법이 하위 층의 연결 가중치를 변경되지 않은 채로 둔다면 안타깝게도 훈련이 좋은 솔루션으로 수렴되지 않을 것

그레이디언트 폭주 : 그레이디언트가 점점 커져서 여러 층이 비정상적으로 큰 가중치로 갱신돼 알고리즘은 발산

 

원인

로지스틱 시그모이드 활성화 함수와 가중치 초기화 방식의 조함. - 각 층에서 출력의 분산이 입력의 분산보다 큼.

 

글로럿과 He 초기화

예측을 할 때는 정방향으로, 그레이디언트를 역전파할 때는 역방향으로 양방향 신호가 적절하게 흘러야 함.

신호가 죽거나, 폭주하거나, 소멸하지 않아야 함.

 

글로럿 초기화 : 각 층의 연결 가중치를 아래 기술한 방식대로 랜덤으로 초기화 하는 것.

He 초기화 : ReLU 활성화 함수와 그 변형을 위한 초기화 전략

 

고급 활성화 함수 : 활성화 함수를 잘못 선택하면 자칫 그레이디언트의 소실이나 폭주로 이어질 수 있음..

죽은 ReLU 문제를 해결하기 위해 같은 LeakyReLU 함수의 변형을 사용한다.

 

ELU

훈련 시간이 줄고 신경망의 테스트 세트 성능도 더 높음

ReLU와 매우 비슷함.

단점으로는 ReLU나 그 변형들보다는 계산이 느리다는 단점이 있음.

 

SELU : 스케일이 조정된 ELU 활성화 함수의 변형

GELU : ReLU 활성화 함수의 부드러운 변형, 다른 활성화 함수보다 계산량이 조금 더 많음.

SILU : 다른 모든 활성화 함수의 성능을 능가함. 이 함수를 Swish라고 붙임.

Mish : 매끄럽고 볼록하지 않고 단조 함수가 아닌 ReLU의 변형

 

💡심층 신경망의 은닉 층에 어떤 활성화 함수를 사용해야 할까?

간단한 작업 → ReLU

더 복잡한 작업 →  Swish

실행 속도가 중요한 경우 → LeakyReLU

심층 MLP의 경우 → SELU

 

 

 

배치 정규화

  • 각 층에서 활성화 함수를 통과하기 전이나 후에 모델에 연산을 하나 추가
  • 이 연산은 단순하게 입력을 원점에 맞추고 정규화한 다음, 각 층에서 두 개의 새로운 파라미터로 결괏값의 스케일을 조정하고 이동시킴. 하나는 스케일 조정에, 다른 하나는 이동에 사용
  • 훈련하는 동안 배치 정규화는 입력을 정규화한 다음 스케일을 조정하고 이동시킴.
  • 테스트 시에는? 훈련이 끝난 후 전체 훈련 세트를 신경망에 통과시켜 배치 정규화 층의 각 입력에 대한 평균과 표준편차 계산

배치 정규화의 단점

  • 모델의 복잡도를 키움
  • 실행 시간 면에서 손해

그레이디언트 클리핑 : 역전파될 때 특정 임곗값을 넘어서지 못하게 그레이디언트를 잘라내는 것. 순환 신경망에서 사용

 

 

 

전이 학습 : 최상위 층을 제외하고 대부분의 층을 재사용, 훈련속도를 크게 높이고 필요한 훈련 데이터를 크게 줄여줌.

  1. 재사용하는 층을 모두 동결
  2. 모델을 훈련하고 성능을 평가
  3. 맨 위에 있는 한두 개의 은닉 층의 동결을 해제하고 역전파를 통해 가중치를 조정해 성능이 향상되는지 확인

 

비지도 사전 훈련 : 레이블이 없는 데이터(비지도 학습)를 먼저 사용하여 모델의 가중치를 초기화한 후, 지도 학습을 수행하는 방식

  • 비지도 훈련에서는 비지도 학습 기법으로 레이블이 없는 데이터를 포함해 전체 데이터로 모델을 훈련
  • 그 다음 지도 학습 기법을 사용해 레이블된 데이터만으로 최종 학습을 위해 세밀하게 튜닝

보조 작업에서 사전 훈련

: 레이블된 훈련 데이터를 쉽게 얻거나 생성할 수 있는 보조 작업에서 첫 번째 신경망을 훈련하는 것

그리고 이 신경망의 하위층을 실제 작업을 위해 재사용

 

 

훈련 속도를 높일 수 있는 빠른 옵티마이저들

 

1. 모멘텀 최적화 : 이전 기울기 정보를 활용하여 관성처럼 움직이며 최적화 속도를 높이고 진동을 줄이는 방법

모멘텀 최적화가 경사 하강법보다 더 빠르게 평편한 지역을 탈출하게 도와줌.

골짜기를 따라 바닥에 도달할 때까지 점점 더 빠르게 내려감.

 

2. 네스테로프 가속 경사 : 현재 위치가 θ 가 아니라 모멘텀의 방향으로 조금 앞선 θ+βm에서 비용 함수의 그레이디언트를 계산하는 것

 

3. AdaGrad : 가장 가파른 차원을 따라 그레이디언트 벡터의 스케일을 감소시켜 (전역 최적점 향한 방향 잡기)문제를 해결하는 것.

적응적 학습률 : 학습률을 감소시키지만 경사가 완만한 차원보다 가파른 차원에 대해 더 빠르게 감소.

전역 최적점 방향으로 더 곧장 가도록 갱신되는데 도움이 됨.

 

4. RMSProp : 훈련 시작부터의 모든 그레이디언트가 아닌 가장 최근 반복에서 비롯된 그레이디언트만 누적함

 

5. Adam : 적응적 모멘트 추정, 모멘텀 최적화와 RMSProp의 아이디어를 합친 것.

적응적 학습률 알고리즘이기 때문에 학습률 하이퍼파라미터 η를 튜닝할 필요가 적음.

기본값 η = 0.001을 일반적으로 사용하므로 경사 하강법보다 Adam이 더 사용하기 쉬움

 

6. Nadam : Adam 옵티마이저에 네스테로프 기법을 더한 것, 종종 Adam 보다 조금 더 빠르게 수렴

 

7. AdamW : 가중치 감쇠라는 규제기법을 통합한 Adam의 변형

 

학습 스케쥴 : 학습률을 감소시키는 전략

  1. 거듭제곱 기반 스케줄링 : 학습률을 훈련 반복 횟수(epoch)의 거듭제곱 함수로 감소시키는 방법
  2. 지수 기반 스케줄링 : 학습률을 초기값에서 일정 비율(지수 함수)로 점진적으로 감소시키는 방법
  3. 구간별 고정 스케줄링 : 학습률을 일정 구간(epoch)마다 특정 값으로 조정하는 방법
  4. 성능 기반 스케줄링 : 모델의 검증 성능(예: 손실 감소 여부)에 따라 학습률을 조정하는 방법
  5. 1사이클 스케줄링 : 학습률을 훈련 초반에는 증가시키고 후반에는 감소시키는 방법

 

드롭아웃 : 신경망 학습 시 일부 뉴런을 확률적으로 비활성화하여 과적합을 방지하는 정규화 기법

  • 매 훈련 스텝에서 각 뉴런은 임시적으로 드롭아웃될 확률 p를 가짐
  • 이번 훈련 스텝에서 완전히 무시되지만 다음 스텝에는 활성화 될 수 있음!
  • 하이퍼파라미터 p를 드롭아웃 비율이라 하며 보통 10~50% 사이로 지정
  • 훈련이 끝난 후에는 뉴런에 더는 드롭아웃을 적용하지 않음.
  • 모델이 과대적합되었다면 드롭아웃 비율을 늘리고 과소적합되면 낮춰야 함.

 

 

몬테 카를로 드롭아웃 : 드롭아웃을 훈련뿐만 아니라 추론 시에도 적용하여 불확실성을 추정하는 방법

맥스-노름 규제 : 가중치 벡터의 노름(norm)이 특정 임계값을 넘지 않도록 제한하여 과적합을 방지하는 정규화 기법

 

 

텐서플로 : 강력한 수치 계산용 라이브러리

  • 핵심구조는 넘파이와 매우 비슷하지만 GPU를 지원
  • 분산 컴퓨팅 지원
  • 계산 그래프를 추출한 다음 최적화하고 효율적으로 실행

 

  • 많은 연산은 커널이라 부르는 여러 구현을 가짐
  • 각 커널은 CPU, GPU 또는 TPU와 같은 특정 장치에 맞추어 만들어짐.
  • 가장 저수준의 텐서플로 연산은 매우 효율적인 C+ 코드로 구현됨.

  • 대부분의 코드는 고수준 API 사용
  • 텐서플로의 실행 엔진은 여러 디바이스와 서버로 이루어진 분산 환경에서도 연산을 효율적으로 실행


넘파이처럼 텐서플로 사용하기

  • 텐서플로는 필요한 모든 기본 수학 연산과 넘파이에서 볼 수 있는 대부분의 연산을 제공함.
  • 그런데 일부 함수들은 넘파이와 이름이 다름.
  • 넘파이 배열에 텐서플로 연산을 적용할 수 있고 텐서에 넘파이 연산을 적용할 수도 있음.
  • 텐서플로는 어떤 타입 변환도 자동으로 수행하지 않음. 호환되지 않는 타입의 텐서로 연산을 실행하면 예외가 발생

 

 

텐서플로가 지원하는 다른 데이터 구조

  1. 희소 텐서(SparseTensor) : 대부분의 값이 0인 텐서를 효율적으로 저장하고 연산하는 데이터 구조
  2. 텐서 배열(TensorArray) : 가변 길이의 텐서 리스트를 다룰 수 있도록 지원하는 데이터 구조
  3. 레그드 텐서(RaggedTensor) : 각 행의 길이가 다른 비정형 데이터를 다룰 수 있는 텐서 구조
  4. 문자열 텐서(String Tensor) : 문자열 데이터를 텐서 형태로 저장하고 연산할 수 있는 데이터 구조
  5. 집합(Set) : 중복을 허용하지 않는 유니크한 값들의 집합 연산을 지원하는 데이터 구조
  6. 큐(Queue) : 데이터를 순차적으로 처리할 수 있도록 FIFO(First In, First Out) 방식으로 관리하는 데이터 구조

 

 

사용자 정의 손실 함수

희귀 모델을 훈련하는 데 훈련 세트에 잡음 데이터가 조금 있다고 가정 -> 이런 경우 평균 제곱 오차 대신 후버 손실을 사용하면 좋음!

 

사용자 정의 지표

손실 : 모델을 훈련하기 위해 경사 하강법에서 사용되므로 미분 가능, 그레이디언트가 모든 곳에서 0이 아니어야 함.

지표 : 모델을 평가할 때 사용, 미분이 가능하지 않거나 모든 곳에서 그레이디언트가 0이어도 괜찮다.

스트리밍 지표 : 데이터를 한 번에 모두 처리하지 않고, 실시간 또는 점진적으로 업데이트하여 계산하는 성능 지표

 

 

사용자 정의 층 : 기본 제공되는 층(Layer) 외에, 특정 연산을 수행하도록 사용자가 직접 정의한 신경망 층

  • 텐서플로에 없는 특이한 층을 만들어야 할 때가 있음.
  • 동일한 층 블록이 여러 번 반복되는 네트워크를 만들 경우 각각의 블록을 하나의 층으로 다루는 것이 편리함. 이런 경우 사용자 정의 층을 만들음.

 

사용자 정의 모델

사용자 정의 모델 클래스 만드는 법 : tf.keras.Model 클래스를 상속해 생성자에서 층과 변수를 만들고, 모델이 해야 할 작업을 call() 메서드에 구현

  1. 입력이 첫 번째 완전 연결 층을 통과하여 두 개의 완전 연결 층과 스킵 연결로 구성된 진차블록으로 전달
  2. 동일한 진차 블록에 세 번 더 통과
  3. 두 번째 진차 블록을 지나 마지막 출력이 완전 연결된 출력 층에 전달

Model 클래스 - Layer 클래스의 서브클래스이므로 모델을 층처럼 정의 할 수 있음.

재구성 손실 : 재구성과 입력 사이의 평균 제곱 오차, 보조 출력에 연결된 손실

그레이디언트 테이프 - 여러 값에 대한 한 값의 그레이디언트를 계산하는 데 사용

 

 

사용자 정의 훈련 반복

일반적으로 fit()함수는 하나의 옵티마이저만 사용하지만, 두 개 이상의 옵티마이저를 사용해야 할 경우 사용자 정의 훈련 반복을 직접 구현해야 한다.

혹은 의도한 대로 잘 작동하는지 확신을 갖기 위해 사용자 정의 훈련 반복을 쓸 수도 있음!

 

텐서플로 함수와 그래프

  • 텐서플로는 사용하지 않는 노드를 제거하고 표현을 단순화하는 등 계산 그래프를 최적화
  • 적절한 순서에 맞춰 그래프 내의 연산을 효율적으로 실행함.
  • XLA  사용 시 속도가 훨씬 빨라지고 메모리도 훨씬 적게 사용함.
  • 텐서플로 함수는 호출에 사용되는 입력 크기와 데이터 타입에 맞춰 매번 새로운 그래프를 생성
  • 텐서플로 함수는 이런 식으로다형성을 처리

오토그래프와 트레이싱

오토그래프 : 파이썬 함수의 소스 코드를 분석해 제어문을 모두 찾는 것.

트레이싱 : 프로그램 실행 흐름을 기록하거나, 연산 그래프를 추적하여 최적화된 모델을 생성하는 기법

 

텐서플로 함수 사용법

  1. 넘파이나 표준 라이브러리를 포함해서 다른 라이브러리를 호출하면 트레이싱 과정에서 실행 될 것, 이 호출은 그래프에 포함되지 않음.
  2.  다른 파이썬 함수나 텐서플로 함수를 호출 할 수 있음.
  3. 함수에서 텐서플로 변수를 만든다면 처음 호출될 때만 수행되어야 함.
  4. 파이썬 함수의 소스 코드는 텐서플로에서 사용 가능해야 함.
  5. 텐서플로는 텐서나 tf.data.Dataset을 순회하는 for 문만 감지함.

 

 

연쇄변환 : 여러 개의 변환 연산을 순차적으로 적용하여 데이터를 처리하는 방법

  1. 원본 데이터셋에서 repeat() 메서드를 호출해 원본 데이터셋의 아이템을 세 차례 반복하는 새로운 데이터셋을 반환
  2. 새로운 데이터셋에서 batch() 메서드를 호출, 다시 새로운 데이터셋이 만들어짐
  3. 이 메서드는 데이터 셋의 아이템을 7개씩 그룹으로 묶음.
  4. 마지막 데이터셋의 아이템을 순회

 

 

데이터 셔플링 하는 법 - shuffle() 메서드를 사용해 샘플을 섞기.

❗메모리 용량보다 큰 대규모 데이터셋은 버퍼가 데이터셋에 비해 작기 때문에 간단한 셔플링 버퍼 방식으로 충분 X

 원본 데이터 자체를 섞어야 함

 

 

 

프리패치 : 훈련 알고리즘이 한 배치로 작업을 하는 동안 이 데이터셋이 동시에 다음 배치를 준비하는 것.

  • GPU를 거의 100% 활용할 수 있음
  • 훈련 속도가 더 빨라짐

 

TFRecord 포맷

  • 대용량 데이터를 저장하고 효율적으로 읽기 위해 텐서플로가 선호하는 포맷
  • 크기가 다른 연속된 이진 레코드를 저장하는 단순한 이진 포맷

 

프로토콜 버퍼 : 구글이 개발한 이식성과 확장성이 좋고 효율적인 이진 포맷

각 레코드는 어떤 이진 포맷도 사용할 수 있지만 일반적으로 TFRecord는 직렬화된 프로토콜 버퍼를 담고 있음.

 

텐서플로 프로토콜 버퍼

  • TFRecord 파일에서 사용하는 전형적인 주요 프로토콜 버퍼
  • 데이터셋에 있는 하나의 샘플을 표현하는 Example 프로토콜 버퍼
  • 이름을 가진 특성의 리스트를 가지고 있음.

 

케라스의 전처리 층

1. Normalization 층

  • 이 층을 만들 때 각 특성의 평균과 분산을 지정할 수 있음.
  • 모델을 훈련하기 전에 이 층의 adapt() 메서드에 훈련 세트를 전달하여 특성의 평균과 분산을 계산할 수 있음.
  • 전처리 불일치 위험을 완전히 제거함.

 

2. Discretization 층

  • 값 범위를 범주로 매핑하여 수치 특성을 범주형 특성으로 전환하는 것
  • 다중모드 분포를 가진 특성이나 타깃과의 관계가 매우 비선형적인 특성에 유용할 때가 있음.

 

3. CategoryEncoding 층

  • 범주의 개수가 적다면 원-핫 인코딩이 좋은 옵션임.
  • 동시에 한 개 이상의 범주형 특성을 인코딩하면 멀티-핫 인코딩을 수행함.

4. Hashing 층

  • 해싱트릭 : 범주를 랜덤하게 버킷에 매핑하는 아이디어
  • Hashing 층은 범주마다 해시를 계산하고 버킷 개수로 나눈 나머지를 구함.
  • 이 매핑은 재현 가능한 랜덤이므로 안정적임.
  • adapt() 메서드를 호출할 필요가 없음.

 

임베딩을 사용해 범주형 특성 인코딩하기

표현 학습 : 표현이 좋을수록 신경망이 정확한 예측을 만들기 쉬움, 따라서 범주가 유용하게 표현되도록 임베딩이 훈련되는 경향이 있음.

단어 임베딩 : 자연어를 컴퓨터가 이해할 수 있도록, 단어를 고정된 크기의 밀집된 벡터로 변환하는 기법

임베딩 행렬 : 범주마다 하나의 행을, 임베딩 차원마다 하나의 열을 가짐.

 

텍스트 전처리

  • 케라스는 기본적인 텍스트 전처리를 위한 TextVectorization 층을 제공
  • 층을 만들 때 vocabulary 매개변수로 어휘 사전을 전달하거나 adapt() 메서드를 사용해 훈련 데이터로부터 어휘 사전을 학습할 수 있음.