데이터 기본 개념

  정량 데이터(Quantitative Data) 정성 데이터(Qualitative Data)
유형 정형 데이터, 반정형 데이터 비정형 데이터
특징 주로 수치로 이루어진 규칙을 따르는 데이터, 객관적 객체 하나하나가 함축적 의미를 내포, 주관적
형태 수치, 스프레드시트, 데이터베이스 문자열, 로그, 이미지 등
위치 DBMS나 로컬 시스템 등의 내부 웹사이트나 플랫폼 등의 외부
통계, 분석 용이 어려움

정량 데이터와 정성 데이터 비교 표 

 

  정형 데이터
(Structured Data)
반정형 데이터
(Semi-Structured Data)
비정형 데이터
(Unstructured Data
개념 고정 포맷(스키마)이 있는 데이터
행과 열 구조이며 검색, 분류가 용이
RDBMS나 스프레드시트에서 다룸
구조가 있지만 정형처럼 엄격하지 않음
태그, 키-값 등의 구조를 가짐
데이터 간 관계가 자유롭고 유동적
명확한 구조나 스키마가 없는 데이터
내용이 다양하고 예측이 불가능
분석을 위한 추가 처리가 필요
예시 엑셀에 저장한 고객명, 전화번호, 주소
은행 거래 내역 테이블
병원 환자 기록 데이터베이스 등
JSON, XML, 이메일, 로그 파일 등 텍스트 문서(보고서, 소설 등)
이미지 파일, 동영상, 음성 파일
SNS 게시물 

그 밖에도 정형, 반정형, 비정형의 구분이 있다.

 

출처: https://www.jeffwinterinsights.com/insights/dikw-pyramid

 

DIKW는 Data Informationo Knowledge Wisdom의 약자이다.

DIKW 피라미드는 데이터를 점차 가공하고 해석하면서 더 높은 수준의 가치를 갖게 되는 과정을 계층 구조로 표현한 것이다.

 

Data는 의미 없이 존재하는 객관적 사실, 숫자, 관찰 결과 등을 말한다.

예시: 22도, 서울, 우천, 습기, 50%

Information은 데이터를 맥락에 맞게 정리하거나 해석하거나, 혹은 의미를 부여한 상태다.

예시: 서울의 현재 기온은 22도이며 우천 확률은 50%이다.

Knowledge는 여러 정보를 연결하여 비교함으로써 이를 이해하거나 응용에 사용하는 것이다.

예시: 서울에서 50% 우천 확률이 있으니 우산을 준비해야 한다.

Wisdom은 지식을 바탕으로 유용한 판단이나 결정을 내리는 행동을 말한다.

예시: 금일 서울에 갈 일이 있다면 작은 우산을 챙기고, 대중교통을 이용한다.

 

데이터베이스

  개념 종류 설명
데이터 조작어
Data ManiPulation
데이터를 추가, 수정, 삭제,
조회할 때 사용하는 SQL
SELECT 데이터 조회
INSERT 데이터 삽입
UPDATE 데이터 수정
DELETE 데이터 삭제
데이터 정의
Data Definition
테이블이나 DB의 구조를
정의하거나 변경하는 SQL
CREATE 테이블, 인덱스, 뷰 생성
ALTER 테이블 구조 생성
DROP 테이블, 인덱스, 뷰 삭제
TRUNCATE 테이블 데이터 전체 삭제 (구조는 유지)
데이터 제어어
Data Control
데이터에 대한 접근 권한을
제어하는 SQL
GRANT 권한을 부여
REVOKE 권한을 회수
트랜잭션 제어어
Transaction Control
트랜잭션(하나의 작업 단위)을
관리하는 SQL
COMMIT 트랜잭션 저장
ROLLBACK 트랜잭션 취소
SABEPOINT 롤백을 위한 저장 시점 설

기본 SQL 구문과 종류

PostgreSQL에서 사용하는 데이터 타입은 공식 docs를 참고하자.

 

환경 설정

PostgreSQL 설치

 

DBeaver 설치 후 PostgreSQL 연동

 

DBeaver에서 수동으로 table 생성

 

테이블 생성 이후 GUI 기반으로 수동 column 생성

 

ALTER TABLE public.user_info ADD user_id char varying(20) NOT NULL;
COMMENT ON COLUMN public.user_info.user_id IS 'This is necessary data';
ALTER TABLE public.user_info ADD CONSTRAINT user_info_pk PRIMARY KEY (user_id);
ALTER TABLE public.user_info ADD user_name char varying(10) NOT NULL;
COMMENT ON COLUMN public.user_info.user_name IS 'user name, not nickname';
ALTER TABLE public.user_info ADD jumin_no character(13) NOT NULL;
COMMENT ON COLUMN public.user_info.jumin_no IS 'personal number, exactly 13 digits';
ALTER TABLE public.user_info ADD tel_co character(2) NOT NULL;
COMMENT ON COLUMN public.user_info.tel_co IS 'telephone company';
ALTER TABLE public.user_info ADD tel_no character(11) NOT NULL;
COMMENT ON COLUMN public.user_info.tel_no IS 'telephone number';

GUI에서 작성한 내용을 자동으로 DBeaver가 자동으로 SQL 구문을 짜준다.

이거는 SQL을 몰라도 사용할 수 있다는 점과 공부하려는 측면에서 생각보다 유용해보인다.

 

ㅇㅇ

 

데이터 삽입

General에서 Format과 Encoding 맞추기

Options에서 Header 옵션 켜기

Columns에서 Columns to Export 확인하기

 

제약 조건 추가

DBeaver 기준)

1. Databases > postgres > Schemas > public > Tables > user_info에서 테이블 우클릭 후

Create > Constraints로 제약 조건 생성하기

2. 테이블까지 들어와서 상단의 Properties에서 위 사진처럼 컬럼명 우클릭 후

New Constraint from Selection으로 제약 조건 생성하기

 

pgAdmin 기준)

Servers > PostgreSQL > Databases > postgres > Schemas > public > Tables에서 원하는 테이블을 우클릭 후

Properties > Constraints > Check로 제약 조건 생성하기

 

쿼리 실행하기

 

pgAdmin 기준)

상단의 Tools > Query Tool을 클릭 후 쿼리 입력하기

 

00

00

PowerBI

BI 설명

 

사용 순서

 

장점

 

PowerBI Desktop의 작업 단계

 

ㅇㅇ

 

실습

ㅇㅇ

 

ㅇㅇ

 

ㅇㅇ

 

ㅇㅇ

 

ㅇㅇ

 

ㅇㅇ

 

ㅇㅇ

 

ㅇㅇ

 

ㅇㅇ

 

ㅇㅇ

 

파워 쿼리는 한 번에 와다닥 내용이 적용

밑에서 하는 테이블 편집은 바로바로 적용

 

DAX

지원하는 연산자

 

 

ㅇㅇ

 

Database Relation

Master Table = 기본적인 정보가 들어있는 테이블

Dimension Table = 중복이 안 되는 기본 정보를 들고 있는 테이블(Master 하위)

Fact Table = 판매, 재고, 환율 등 관찰이나 이벤트 정보를 기록한 테이블

Primary Key = Dimension Table에서의 기준이 되는 column, 중복이 없는 고윳값

Foreign Key = Fact Table에서 Dimension Table과 연결할 수 있는 column, 중복 포함 가능, 존재하지 않을 수도 있음

 

dd

 

dd

 

dd

 

dd

 

머신러닝

ㅇㅇ

 

학습 구분 상세 구분 종류
지도학습
(Supervised)
회귀(Regression) Linear Regression
Ridge Regression
Lasso Regression
Decision Trees Regression
Support Vector Regression
K-Nearest Neighbors Regression
Random Forests Regression
분류(Classification) Logistic Regression
Decision Trees Classifier
K-Nearest Neighbors Classifier
Random Forests Classifier
비지도학습
(Unsupervised)
군집화 K-Means clustering
DBSCAN
차원 축소 PCA

머신러닝 유형별 다양한 알고리즘들이다.

물론 이보다 훨씬 더 많고 상세한 분류 알고리즘들이 존재한다.

 

ㅇㅇ

 

독립 변수, 종속 변수 선택

 

필터 방법 설명
상관계수 기반 선택
(Correlation Coefficient)
연속형 변수와 연속형 타겟 간의 상관 관계를 측정하여 중요한 특성을 선택
카이제곱 검정 기반 선택
(Chi-square Test)
범주형 변수와 타켓 간의 관계를 평가하여 선택
분산 분석 기반 선택
(Variance)
분산이 낮은 특성, 정보가 적은 특성을 제거
정보 이득 기반 선택
(Information Gain)
각 특성과 타겟 간의 정보의 양을 측정하여 선택

어떤 컬럼을 선택할 지에 대한 방법 중 필터 방법(Filter Method)에 해당하는 방법이다.

통계적 특성에 기반하여 중요도를 평가하고, 특정 기준에 따라 변수를 선택하거나 제거한다.

변수 선택을 모델 학습과 독립적으로 수행한다.

 

래퍼 방법 설명
전진선택법
(Forward Selection)
가장 중요한 특성부터 하나씩 추가하면서 모델의 성능을 평가
후진제거법
(Backward Elimination)
모든 특성으로 시작하여 가장 덜 중요한 특성부터 하나씩 제거
단계적 선택법
(Stepwise Selection)
전진선택법과 후진제거법을 번갈아가면서 적용

어떤 컬럼을 선택할 지에 대한 방법 중 래퍼 방법(Wrapper Method)에 해당하는 방법이다.

특정 모델을 사용하여 다양한 특성 조합을 평가하고 가장 좋은 성능을 보이는 조합을 선택한다.

변수 선택 과정에서 모델 학습을 한다.

 

임베디드 방법 설명
L1 정규화
(Lasso)
회귀 모델에서 L1 정규화를 적용하여 특성 중 일부의 계수를 0으로 만들어 선택
L2 정규화
(Ridge)
L2 정규화를 통해 덜 중요한 특성의 영향력 감소
엘라스틱넷 Lasso와 Ridge의 조합
트리 기반 방법 트리 기반 모델로 특성 중요도를 계산하여, 이를 바탕으로 중요하지 않은 특성을 제거

어떤 컬럼을 선택할 지에 대한 방법 중 임베디드 방법(Embedded Method)에 해당하는 방법이다.

모델 학습 과정에서 변수 선택을 수행한다.

특정 알고리즘이나 특성 선택을 내장하고 있어 학습과 선택이 동시에 이루어진다.

 

차원 축소 방법 설명
주성분 분석
(PCA)
데이터의 분산을 최대화하는 새로운 축을 찾아 차원을 축소한다.
선형 판별 분석
(LDA)
클래스 구분을 최대화하는 축을 찾는 방법으로, 분류 문제에서 유용하다.

차원 축소 방법(Dimensionality Reduction)에 대한 설명이다.

특성의 수를 줄이는 접근 방식으로, 원래 특성을 사용하지 않고 주성분이라는 새로운 특성을 생성한다.

 

결측치 처리 방법 구체 방안 설명
결측치 제거 Listwise Deletion 결측치가 있는 행 전체를 제거하는 방법
Pairwise Deletion 분석에 사용하는 변수에 결측치가 있는 경우만 제거하는 방법
결측치 대체 특정 값 대체 특정 값(0, 1, -1 등)으로 대체하는 방법
대푯값 대체 평균값, 중앙값, 최빈값 등으로 대체하는 방법
회귀 대체 결측치가 있는 변수를 다른 변수의 값으로 예측하여 대체하는 방법
KNN 대체 K-최근접 이웃 알고리즘을 사용하여 유사한 샘플들의 값으로 대체하는 방법
전방값으로 채우기 시계열에서 이전 값으로 대체하는 방법
후방 값으로 채우기 시계열에서 다음 값으로 대체하는 방법
도메인 지식 활용하기 전문가의 판단으로 적절한 값으로 대체하는 방법

결측치 처리 방법에 따라서 분석 결과가 달라질 수 있으므로 가능하면 여러 방법을 시도 후 결과를 비교하며 선택한다.

 

ㅇㅇ

 

이상치 처리 설명
제거 확실한 이상치나 오류인 경우 해당 데이터를 제거
변환 로그 변환, 제곱근 변환, Box-Cox 변환 등을 통해 큰 값의 영향을 줄임
대체 평균/중앙값 대체, 이상치를 특정 한곗값으로 대체, 도메인 지식을 활용하여 수정 등의 방법으로 대체
모델링 이상치에 덜 민감함 모델링 기법을 사용(RandomForest, Boosting 모델 등)
스케일링 Robust 스케일링 사용
이는 이상치의 영향을 줄이기 위해 중앙값과 IQR을 사용하여 데이터를 스케일링하는 방법

 

ㅇㅇ

 

데이터 유형 특징 예시
수치형 데이터 연속형 데이터 셀 수 없는 수치형 자료 키, 몸무게, 기온
이산형 데이터 셀 수 있는 수치형 자료 나이, 판매량
범주형 데이터 순위형 데이터 순서가 있는 범주형 자료 등급, 학점
명목형 데이터 순서가 없는 범주형 자료 성별, 혈액형, 지역

범주형 데이터는 숫자 형태로 인코딩이 필요하다.

 

ㅇㅇ

 

종류 방법 적용 사례
표준화
(Standardization)
평균이 0, 분산이 1이 되도록 변환 - 선형회귀, 로지스틱회귀, SVM 등 대부분에 적합
- 데이터가 정규 분포를 따른다고 가정하는 경우
정규화
(Normalization)
데이터를 0과 1 사이 범위로 변환
음수가 있을 경우 -1에서 1사이로 변환
- KNN, SVM 등의 거리 기반 알고리즘을 사용하는 경우
- 데이터가 정규 분포를 따르지 않는 경우
- 신경망, 이미지 처리 등 0 ~ 1 범위가 중요한 경우
로버스트 스케일링
(Robust Scaling)
중위수(median)과 IQR(사분위수)를
사용하여 스케일링
- 이상치가 존재할 때 평균과 표준편차 대신에
  중위수와 IQR을 사용하여 이상치의 영향을 줄여야 하는 경우
로그 변환
(Log Transformation)
데이터의 값을 log 스케일로 변환 - 비대칭 분포인 경우
(데이터가 정규 분포에서 벗어나 한 쪽으로 치우친 경우)
- 양수에 대해서만 가능하다는 한계

피처 스케일링(Feature scaling)에 대한 설명이다.

특정 변수의 값이 서로 다른 범위에 있는 경우, 이를 동일한 범위로 조정하는 방법

수치형 변수의 범위, 분포가 차이나는 경우에 사용한다.

 

평가 방법 종류
회귀 MSE, MAE, RMSE, R^2
분류 Accuracy, Precision, Recall, Sensitivity, F1-score, ROC-AUC curve

ㅇㅇ

 

Scikit Learn

구분 모듈 함수 및 클래스
데이터 전처리 sklearn.preprocessing StandardScaler, MinMaxScaler, Robustscaler
데이터 분리
및 검증
sklearn.model_selection train_test_split, KFold, cross_val_scores
머신러닝 sklearn.linear_model LinearRegression, Ridge, etc...
성능 평가 sklearn.metrics mean_squared_error, etc...

00

 

구분 함수 설명
선형 회귀
예측기
fit(X_train, y_train) 모델 훈련
predict(X_test) 훈련한 모델 기반 결괏값 예측
score(X, y) 점수 산출
coef_ 모델의 회귀 계수
intercept_ 모델의 절편
표준화
변환기
fit(X_train, y_train) 변환기 학습
transform(X_test) 변환기로 변환
fir_transform(X, y) 학습 및 변환 동시 진행

ㅇㅇ

 

- Hamming Distance

- Euclidean Distance

- Manhattan Distance

- Minkowski Distance

 

00

00

melt, pivot_table

  설명
   
   
   
   
   

ㅇㅇ

 

Datetime

  설명
datetime from datetime import datetime
month, day, hour, mintue, second
now()  
date()  
time()  
weekday()  
strftime(format)  
strptime(date_str, format)  
timedelta from datetime import timedelta
month, day, hour, mintue, second
relativedelta from dateutil.relativedelta import relativedelta
timestamp  
date_range() 일정한 간격의 DateTimeIndex를 생성
매개변수로는 start, end, periods(생성할 개수), freq(간격) 등이 있다.
freq는 YS/YE(연초/연말), QS/QE(분기초/분기말), MS/ME(월초/월말),
W(주별(일 기준)), W-MON(주별(월 기준)), D(일별), B(영업일),
h(시간), min(분), S(초), ms(밀리초), us(마이크로초), ns(나노초) 등이 있다.

링크 string format 참고

 

Sample, Shift, Rolling, Expanding

  설명
   
   
   
   
   

ㅇㅇ

 

 

Concat

매개변수 설명
DataFrame 연결할 dataframe을 매개변수로 주어준다.
2개만 이름으로 줘도 되지만, 3개 이상은 iterable object로 주어야 한다.
ignore_index 병합할 때 index를 무시하고, 0 ~ n까지의 index를 새롭게 부여한다.
join SQL의 join을 생각하면 편하다. 어디를 기준으로 어떻게 연결할지 정하는 매개변수다.
inner, outer가 있고 default 값은 outer다.
axis 어느 축으로 할지 결정한다. 0은 행을 기준으로, 1은 열을 기준으로 연결한다.

pandas 라이브러리의 concat 함수 매개변수 설명이다.

 

Merge

매개변수 설명
left, right merge는 두 개의 dataframe만 가능하다. 3개 이상은 불가능하다.
따라서 left와 right의 데이터프레임에 매개변수로 넘겨주면 된다. 당연하지만 순서에 유의하자.
how SQL의 join에 해당한다. left, right, inner, outer가 있다.
on 어떤 column을 기준으로 병합할지 선택하는 매개변수다.
left on, right on SQL의 LEFT ON, RIGHT ON과 유사하다.
LEFT ON과 RIGHT ON의 column 이름은 다르지만 데이터가 같을 때 사용한다.
SQL과 달리 특이한 점은 한 쪽만 남기지 않고, 모두 하나의 dataframe에 병합해서 보여준다.
이후 특정 하나의 column을 drop으로 따로 지워줘야 한다.

pandas 라이브러리의 merge 함수 매개변수 설명이다.

 

Groupby

groupby 함수 설명
df.groupby(std) 어떤 기준으로 dataframe을 그룹화할지 정하는 함수다.
group_obj.groups 그룹이 어떻게 묶였는지 확인할 수 있다. 반환값은 dict이다.
group_obj.ngroups 몇 개의 그룹으로 묶였는지 확인할 수 있다. 반환값은 int다.
group_obj.get_group(name) name에 해당하는 group만을 데이터프레임을 반환한다.
group_obj.describe()
 group obj의 전체 요약 통계를 보여준다.
column을 지정하면 특정 column의 요약 통계만 조회할 수도 있다.
agg  

pandas 라이브러리의 groupby 함수에 대한 설명이다.

 

Folium

매개변수 설명
   
   
   
   

folium 라이브러리 설

 

Subplot

출처: https://wikidocs.net/4761

 

Subplot은 말그대로 한 화면에 여러 개의 그래프를 그리는 것이다.

Subplot을 그리는 방법에는 크게 2가지 방식이 있다.

 

# plt.figure(figsize=(8, 8))

plt.subplot(2, 2, 1)
plt.scatter(df1['x'], df1['y'])

plt.subplot(2, 2, 2)
plt.scatter(df2['x'], df2['y'])

plt.subplot(2, 2, 3)
plt.scatter(df3['x'], df3['y'])

plt.subplot(2, 2, 4)
plt.scatter(df4['x'], df4['y'])
# plt.title()

# plt.suptitle()

dd

 

plt.subplots(2, 2)

'''
(<Figure size 640x480 with 4 Axes>,
 array([[<Axes: >, <Axes: >],
        [<Axes: >, <Axes: >]], dtype=object))
'''

dd

 

fig, axes = plt.subplots(2, 2)
# fig, axes = plt.subplots(2, 2, figsize=(5, 5), sharex=True, sharey=True)

axes[0][0].scatter(df1['x'], df1['y'])
# axes[0][0].set_title()
# axes[0][0].set_xlabel()
# axes[0][0].set_xlim()

axes[0][1].scatter(df2['x'], df2['y'])

axes[1][0].scatter(df3['x'], df3['y'])

axes[1][1].scatter(df4['x'], df4['y'])

# fig.suptitle() / plt.suptitle()
# fig.tight_layout() / plt.tight_layout()

dd

 

dd

 

fig, axes = plt.subplots(2, 2)
axes = axes.flatten()

dfs = [df1, df2, df3, df4]
for i, df in zip(range(len(dfs)), dfs):
    axes[i].scatter(df['x'], df['y'])
    axes[i].set_title(f"{chr(i+8544)} subplot")

fig.suptitle("Subplots")
fig.tight_layout()

놀랍게도 axes는 2차원 객체라서 flatten() 함수로 1차원 변환이 가능하다.

이를 활용해 반복문으로 비교적 간단하게 subplot을 그리는 게 가능하다. 

 

seaborn

seaborn 그래프 종류 설명
barplot  
scatterplot  
regplot  
boxplot  
violinplot  
histplot  
countplot  
heatmap  
pairplot  

seaborn 라이브러리의 그래프 종류에 대한 설명이다.

 

그외 데이터 실습

 

 

pandas

출처: https://wikidocs.net/205999

 

pandas는 Series와 DataFrame이라는 두 가지 자료구조를 제공한다.

Series는 순차 데이터를 저장하는 1차원 배열로, 단일 타입(숫자 또는 문자) 데이터로 구성한다.

DataFrame은 행열로 구성된 2차월 배열로, 각 열에 서로 다른 타입의 Series로 구성한다.

 

Series의 구조 설명은 위와 같다.

 

Series 기본 속성 설명
values  
index  
dtype  
name  
shape  

pandas 라이브러리의 Series 생성자에 대한 설명이다.

자세한 것은 공식 docs의 Series 설명을 참고하도록 하자.

 

Series 메소드 설명
info()  
value_counts()  
sort_values()  
isnull()  
notnull()  
dropna()  
fillna()  
astype()  
agg func(집계 함수) mean() 평균 / sum() 합계 / min() 최솟값 / max() 최댓값 / std() 표준편차 등

pandas 라이브러리의 Series 생성자의 기본 메소드들이다.

자세한 것은 공식 docs의 Series 설명을 참고하도록 하자.

 

Series 데이터 관리 구분 설명
series.loc[] 조회 index label로 접근하는 방법이다. list나 slice로 접근 시 마지막 index를 포함한다.
series.iloc[] 조회 range index label로 접근하는 방법이다. list나 slice로 접근 시 마지막 index를 미포함한다.
series[index] = data 추가, 수정 index label을 key로 해서 value를 data로 변경한다.
del series[index] 삭제 index label을 key로 해서 series의 index-value 쌍을 제거한다.

pandas 라이브러리의 Series 생성자의 데이터 관련 함수들이다.

데이터 조회, 추가, 수정, 삭제 등에 대한 함수다.

 

DataFrame의 구조 설명은 위와 같다.

 

DataFrame 메소드 설명
shape  
dtypes  
columns  
values  
index  
size  
T  
describe  
agg func(집계 함수) mean() 평균 / sum() 합계 / min() 최솟값 / max() 최댓값 / std() 표준편차 등
value_counts  
sort_values(
    by=col_name,
    ascending=bool
)
col_name을 기준으로 정렬하는 함수
ascending 옵션으로 True/False를 지정하여 오름차순/내림차순을 지정할 수 있다.
sort_index()  

pandas 라이브러리의 DataFrame 생성자에 대한 메소드 설명이다.

자세한 것은 공식 docs의 DataFrame 설명을 참고하도록 하자.

 

DataFrame Index 설명
df.reset_index() index label을 range index로 초기화하고,
현재 index label 값을 index 컬럼으로 데이터 프레임에 들어간다.
df.set_index(column) 현재 존재하는 column을 index label로 설정한다.
column에 list로 값을 주어 중첩 index를 설정하는 것도 가능하다.
df.rename(mapper, *index, *axis) mapper(dict거나 함수)로 주어진 대로 이름을 변경한다.

pandas 라이브러리의 DataFrame의 index 관련 함수에 대한 설명이다.

자세한 것은 공식 docs의 DataFrame 설명을 참고하도록 하자.

 

DataFrame 데이터 관리 구분 설명
info 조회 메소드 객체 자체를 조회한다.
info() 조회 info 메소드로, DataFrame의 요약 정보를 출력한다.
head(n) 조회 데이터프레임의 상위 n개 행을 샘플링하여 보여준다.
tail(n) 조회 데이터프레임의 하위 n개 행을 샘플링하여 보여준다.
sample(n) 조회 데이터프레임의 무작위 n개 행을 샘플링하여 보여준다.
loc[:] 조회 index label로 접근하는 방법이다. list나 slice로 접근 시 마지막 index를 포함한다.
iloc[:] 조회 range index label로 접근하는 방법이다. list나 slice로 접근 시 마지막 index를 미포함한다.
df[col_name] 조회 Series 객체로 데이터를 조회한다. col_name을 list로 던져줄 수 있다.
df[[col_name]] 조회 DataFrame 객체로 데이터를 조회한다. col_name을 list로 던져줄 수 있다.
df[col_name] = data 추가, 수정 col_name의 컬럼에 데이터를 추가한다. 이미 컬럼이 있다면 수정한다.
drop(col_name, axis) 삭제 axis에 해당하는 col_name 컬럼을 삭제한다.

pandas 라이브러리의 DataFrame의 데이터 관련 함수들이다.

데이터 조회, 추가, 수정, 삭제 등에 대한 함수다.

 

DataFrame 결측치 함수 설명
isna() / isnull()  
dropna  
fillna  
ffill  
bfill  

pandas 라이브러리의 DataFrame의 결측치 관련 함수들이다.

 

Visualization

그래프 종류 설명
plot  
bar  
barh  
pie  
scatter  
hist  
boxplot  
violinplot  

dd

 

 

데이터 분석 방법론

출처: https://www.scaler.com/topics/data-mining-tutorial/kdd-in-data-mining/

 

KDD 방법론

Knowledge Discovery in Database

 

출처: https://blog.knoldus.com/data-science-project-life-cycle/

 

CRISP-DM 방법론

CRoss Industry Standard Process for Data Mining

 

빅데이터 분석 방법론

 

NumPy Library

numpy 생성 함수 설명
array() iterable object를 NumPy 배열로 변환
arange(start, stop, step) arange 지정 구간을 NumPy 배열로 생성
zeros(size) 0으로 채워진 size 크기의 NumPy 배열을 생성
ones(size) 1로 채워진 size 크기의 Numpy 배열을 생성
full((n, m), value) n * m 크기의 NumPy 배열을 value 값으로 채워서 생성
eye(n, *m) n * m 크기의 NumPy 배열로 단위 행렬을 생성, m 매개변수 생략 시 n * n 크기로 생성
identity(n) n * n 크기의 NumPy 배열로 단위 행렬을 생성, 정사각행렬 전용 메소드
tri(n, *m) n * m 크기의 NumPy 배열로 하삼각행렬 생성, m 매개변수 생략 시 n * n 크기로 생성
tril(a) 배열 a의 하삼각행렬만을 남겨서 반환
triu(a) 배열 a의 상삼각행렬만을 남겨서 반환
linespace(start, stop, num) start부터 stop(포함) 범위에서 균등 간격으로 나누어 num개의 값을 NumPy 배열로 생성
*는 선택 매개변수, 모든 매개변수를 적지는 않고 접근성이 높은 몇 매개변수만 기재한다.

numpy의 생성 함수에 대한 설명

 

numpy.random 메소드 설명
random(size) 0에서 1 사이의 무작위 float 값으로 채운 size 크기의 NumPy 배열 생성
randint(low, *high, *size) low 이상 high 미만의 size 개수만큼 무작위 정수 NumPy 배열 생성
rand(size) 균등분포를 따르는 무작위 float 값을 size 크기로 NumPy 배열 생성 
randn(size) 표준정규분포를 따르는 무작위 float 값을 size 크기로 NumPy 배열 생성
uniform(low, high, size) low 이상 high 미만의 무작위 float 값을
size 크기로 균등분포를 따르는 NumPy 배열 생성
normal(loc, scale, size) loc를 평균, scale을 표준편차로 갖는 정규분포를 따르는
무작위 float 값을 size 크기로 Numpy 배열 생성
poisson(lam, size) 포아송 분포 기반 난수 생성
binomial(n, p, size) 이항 분포 기반 난수 생성
beta(a, b, size) 베타 분포 기반 난수 생성
gamma(shape, scale, size) 감마 분포 기반 난수 생성
exponential(scale, size) 지수 분포 기반 난수 생성
chisquare(df, size) 카이제곱 분포 기반 난수 생성
geometric(p, size) 기하 분포 기반 난수 생성
lognormal(mean, sigma, size) 로그 정규 분포 기반 난수 생성
seed(seed) 전역 고정 난수 선언
RandomState(seed) 특정 컨테이너 고정 난수 선언
*는 선택 매개변수, 모든 매개변수를 적지는 않고 접근성이 높은 몇 매개변수만 기재한다.

numpy.random 메소드에 대한 설명

 

numpy 집계 함수 설명
sum(a, *axis, *dtype) 배열 a의 axis 축을 기준으로 더해서 dtype으로 반환
NaN 값을 무시하는 함수로 nansum()이 존재
mean(a, *axis, *dtype) 배열 a의 axis 축을 기준으로 평균을 내서 dtype으로 반환
NaN 값을 무시하는 함수로 nanmean()이 존재
median(a, *axis) 배열 a의 axis 축을 기준으로 중앙값을 찾아 dtype으로 반환
NaN 값을 무시하는 함수로 nanmedian()이 존재
std(a, *axis, *dtype) 배열 a의 axis 축을 기준으로 표준편차를 계산해 dtype으로 반환
NaN 값을 무시하는 함수로 nanstd()가 존재
var(a, *axis, *dtype) 배열 a의 axis 축을 기준으로 분산을 계산해 dtype으로 반환
NaN 값을 무시하는 함수로 nanvar()가 존재
min(a, *axis)
max(a, *axis)
배열 a의 axis 축을 기준으로 최솟값과 최댓값을 탐색
NaN 값을 무시하는 함수로 nanmin() / nanmax()가 존재
argmin(a, *axis)
argmax(a, *axis)
배열 a의 axis 축을 기준으로 최솟값 위치와 최댓값 위치를 탐색
NaN 값을 무시하는 함수로 nanargmin() / nanargmax()가 존재
ptp(a, *axis) 배열 a의 axis 축을 기준으로 (최댓값 - 최솟값)을 계산
percentile(a, q, *axis) 배열 a의 axis 축을 기준으로 q(0 ~ 100)%의 백분위 값을 반환
NaN 값을 무시하는 함수로 nanpercentile()이 존재
quantile(a, q, *axis) 배열 a의 axis 축을 기준으로 q(0 ~ 1)의 분위 값을 반환
NaN 값을 무시하는 함수로 nanquantile()이 존재
cumsum(a, *axis, *dtype) 배열 a의 axis 축을 기준으로 누적합을 계산해 dtype으로 반환
NaN 값을 무시하는 함수로 nancumsum() 함수가 존재
cumprod(a, *axis, *dtype) 배열 a의 axis 축을 기준으로 누적곱을 계산해 dtype으로 반환
NaN 값을 무시하는 함수로 nancumprod() 함수가 존재
prod(a, *axis, *dypte) 배열 a의 axis 축을 기준으로 곱셈을 계산해 dtype으로 반환
NaN 값을 무시하는 함수로 nanprod 함수가 존재
*는 선택 매개변수, 모든 매개변수를 적지는 않고 접근성이 높은 몇 매개변수만 기재한다.

numpy 집계 함수에 대한 설명

 

표현
문자
NumPy
dtype
Canonical (정식 표현) C 대응 타입 비트 수 및 범위 플랫폼 의존성
b int8 numpy.byte char 8비트
(-128 ~ 127)
B uint8 numpy.ubyte unsigned char 8비트
(0 ~ 255)
h int16 numpy.short short 16비트
(-32,768 ~ 32,767)
H uint16 numpy.ushort unsigned short 16비트
(0 ~ 65,535)
i int32 numpy.intc int 보통 32비트
(-2,174,483,648 ~ 2,147,483,647)
I uint32 numpy.uintc unsigned int 보통 32비트
(0 ~ 4,294,967,295)
l int64 / int
intp
numpy.int_ / numpy.long
numpy.intp
long
intptr_t
32비트(Win), 64비트(Unix)
(-2^63 ~ 2^63 - 1)
L uint64
uintp
numpy.uint / numpy.ulong
numpy.uintp
unsigned long
uintptr_t
32비트(Win), 64비트(Unix)
(0 ~ 2^64 - 1)
q longlong numpy.longlong long long 항상 64비트
Q ulonglong numpy.ulonglong unsigned long long 64비트

numpy의 정수형 데이터 정리

 

데이터 타입 종류 표현문자
실수형
floating
float16, numpy.half에 해당하는 데이터 타입 e
float32, numpy.single에 해당하는 데이터 타입 f
float64, numpy.double에 해당하는 데이터 타입 d
float128, numpy.longdouble에 해당하는 데이터 타입 g
복소수형
complextfloating
complex64, numpy.csingle에 해당하는 데이터 타입 F
complex128, numpy.cdouble에 해당하는 데이터 타입 D
complex256, numpy clongdouble에 해당하는 데이터 타입 G
논리형 bool_ ?
문자열
character
유니코드 문자열: str_ (U10의 경우, 유니코드 10글자까지 저장) U
바이트 문자열: bytes_ (S10의 경우, 10바이트까지 저장) S
날짜, 시간 datetime64(날짜와 시간 정보) M
timedelta64(두 날짜 사이의 시간 간격) m
기타 object(나머지 객체형 데이터) O
void(구조체, 복합 데이터) V

그 밖에 numpy의 데이터 타입

 

출처: https://numpy.org/doc/2.2/reference/arrays.scalars.html#numpy.datetime64

 

NumPy의 데이터 타입을 도식으로 표현하면 위와 같다.

참고로 CategoricalDtype은 NumPy가 아니라 pandas의 데이터 타입이다.

 

numpy 배열 형태 조작 함수 설명
reshape(a, new_shape) 배열 a의 shape를 new_shape로 변경한다.
변경 전후의 요소 개수가 일치해야만 오류가 없다.
resize(a, new_shape) 배열 a의 shape를 new_shape로 변경한다.
변경 전후 요소 개수가 달라도 알아서 보정해준다.
ravel(a) 다차원 배열을 1차원으로 평탄화한다.
가능하다면 원본 배열의 view를 반환하는 함수 
flatten() 다차원 배열을 1차원으로 평탄화한다.
원본 배열의 복사본을 반환하는 함수
transpose() / T  
expand_dims(a, axis)  
squeeze(a, *axis)  
concatenate((a1,a2, ...), *axis)  
stack(a, *axis)  
hstack(tup)  
vstack(tup)  
split(ary, indices_or_sections)  
repeat(a, repeats, *axis)  
*는 선택 매개변수, 모든 매개변수를 적지는 않고 접근성이 높은 몇 매개변수만 기재한다.

numpy 배열 형태 조작 함수

 

numpy 조건 처리
및 논리 연산 함수
설명
where(condition, [x, y, ])  
select(condlist, choicelist)  
any(a, *axis)  
all(a, *axis)  
isin(element, test_elements)  
logical_and(x1, x2)  
logical_or(x1, x2)  
equal(x1, x2)  
not_equal(x1, x2)  
greater(x1, x2)  
less(x1, x2)  
clip(a)  
*는 선택 매개변수, 모든 매개변수를 적지는 않고 접근성이 높은 몇 매개변수만 기재한다.

numpy 조건 처리 및 논리 연산 함수

 

🔁 2. 배열 형태 조작

메서드설명
a.reshape(new_shape) 배열 모양 변경
a.flatten() 1차원으로 평탄화
a.ravel() 뷰(view) 기반 1차원화
a.T 전치 (transpose)
np.concatenate((a, b), axis) 배열 연결
np.stack((a, b), axis) 차원 추가해서 스택
np.split(a, indices) 배열 분할
np.expand_dims(a, axis) 새 차원 추가
np.squeeze(a) 차원 축소

🎯 4. 조건 처리 및 논리 연산

메서드설명
np.where(cond, x, y) 조건에 따라 값 선택
np.any(a) / np.all(a) 하나라도 / 모두 조건 만족
np.isin(a, values) 포함 여부 판별
np.unique(a) 중복 제거 후 정렬
np.logical_and(a, b) 논리 AND
np.logical_or(a, b) 논리 OR

ELECTRA

출처: https://tech.scatterlab.co.kr/electra-review/

 

기존 BERT는 MLM(Masked Language Model)을 주 구조로 학습하는 인공지능 모델이다.

ELECTRA는 Efficiently Learning an Encoder that Classifies Token Replacements Accurately의 약자로,

효율적인 학습 방법을 Encoder에서 적용한 모델이다.

MLM에서 예측한 단어가 올바른지 아닌지(original/replaced) 확인하는 구조를 추가한 모델이 ELECTRA다.

[MASK]를 예측하는 구조를 Generator라고 부르고, 예측 올바름을 판단하는 구조를  Discriminator라고 부른다.

물론 Generator는 BERT에서 사용하는 것보다는 작은 규모를 사용하고,

단순히 입력 변형용 및 학습으로만 사용해서 최종 모델은 Discriminator만을 사용한다.

 

Generator와 Discriminator의 관계를 살펴보면 경쟁하는 것처럼 보이기도 한다.

Generator가 단어를 잘 예측할수록 Discriminator는 구별하기 어려워지고,

Discriminator가 잘 구별할수록 Generator는 더 진짜 같은 단어를 예측하려고 한다.

이렇게 두 모델이나 네트워크가 서로 경쟁하는 구조를 Adversarial training이라고 한다.

대표적으로 이미지 생성의 GAN(Generative Adversarial Network)이 이러하다. 

 

출처: https://openreview.net/pdf?id=r1xMH1BtvB

 

ELECTRA 논문에서 Replaced token detection pre-training vs masked language model pre-training라는 이름으로

기존에 존재하는 Generator 기반의 모델들과 Discriminator를 추가한 모델의 성능을 비교한 표다.

다른 모델보다 계산량에 비해서 GLUE score가 더 좋은 것을 확인할 수 있다.

 

Light Weight Models

기존의 모델을 개선한다는 것은 성능을 올리는 것에 국한하지 않는다.

메모리를 줄인다든가 학습 시간을 줄인다든가 구조를 간략하게 한다든가 등이 있다.

그 중에서도 모델을 경량화하는 것에 초점을 맞추고 진행한 연구가 다수 있다.

그렇게 나온 대표적인 경량 모델이 DistillBERT와 TinyBERT가 있다.

 

두 모델은 모두 Knowledge Distillation(지식 증류)라는 기법을 사용했다. 

이는 BERT가 사전 학습(pretraining)하면서 배운 지식을 압축해서 학습하는 과정이다.

이를 위해 Teacher 모델과 Student 모델이라는 개념을 도입했다.

 

출처: https://arxiv.org/pdf/1909.10351

 

DistillBERT는  2019년 Hugging Face가 NeurIPS에 발표한 모델이다.

DistillBERT의 Teacher 모델은 BERT-large처럼 정확도는 높지만 큰 모델을 가져다가 학습을 진행하고

Student 모델은 teacher 모델보다 작은 규모의 모델을두고, teacher의 지식만을 학습하는 과정을 거친다.

정확하게는 Teacher의 softmax 확률 분포를 ground truth로 학습한다.

이러면 BERT-large의 최종 출력을 흉내내는 모양새를 띈다.

 

출처: https://arxiv.org/pdf/1909.10351

 

TinyBERT는 2020년 Huawei가 Findings of EMNLP에 발표한 모델이다.

DistillBERT에서 student가 teacher의 softmax 확률 분포만을 학습했다면,

TinyBERT에서는 teacher의 softmax 확률 분포, 가중치 행렬(W^Q, W^k, W^V, W^O), hidden state vector 등

중간 결과물을 싹 다 학습한다는 차이점이 존재한다.

즉 최종 출력만 흉내내는 게 아니라, layer별로 정렬해서 학습한다.

 

1. Hidden state distillation으로 각 층의 hidden state를 학습하고(손실함수는 MSE),

2. Attention distillation으로 각 층의 Self Attention Matrix를 학습하고(손실함수는 MSE나 KL Divergence),

3. Prediction layer distillation으로 최종 출력의 값을 학습한다.

 

조금 더 상세하게 teacher의 과정을 학습하는 TinyBERT는 이 과정을 2개로 나눠서 학습한다.

하나는 General Distillation(혹은 Pretraining Distillation)이라고, 본래 BERT를 학습하는 과정으로 1번과 2번을 수행하며

다른 하나는 Task Specific Distillation이라고, 특정 task의 fine tuning을 학습하는 과정으로 1, 2, 3번을 모두 수행한다.

 

Knowledge Graph

출처: https://en.wikipedia.org/wiki/Knowledge_graph

 

Knowledge Graph(지식 그래프)란, 사물(개체)들 사이 관계를 그래프 구조로 표현한 지식 데이터베이스다.

BERT는 맥락, 단어 간 유사도 판별에는 뛰어나나, 주어진 데이터 외 정보 활용에는 좋지 못하다.

그래서 외부 정보와 그 관계를 지닌 KG를 학습하여, 상식을 추가해주는 형태의 연구가 이루어지고 있다.

언어 모델에 KG를 통합한 대표적인 사례로 ERNIE와 KagNet이 있다.

 

출처: https://arxiv.org/pdf/1905.07129

 

ERNIE(Enhanced Language Representation with Informative Entitites)

그래프의 노드를 embedding한 entity embedding vector와 기존의 token embedding vector를 연결해서 사용

출처: https://arxiv.org/pdf/1909.02151

 

KagNet(Knowledge Aware Graph Networks for Commonsense Reasoning)

각각의 질문과 정답 후보 쌍을 외부 지식 그래프에서 서브 그래프 형태로 탐색하는 모델

 

'공부 > BoostCourse 자연어 처리' 카테고리의 다른 글

22. NLP Trends - ALBERT  (0) 2025.04.02
21. NLP Trends - GPT 2, GPT 3  (1) 2025.04.01
20. NLP Trends - BERT 2  (0) 2025.03.31
19. NLP Trends - BERT 1  (0) 2025.03.28
18. NLP Trends - GPT 1  (0) 2025.03.27

ALBERT - Low Rank Matrix Factorization

ALBERT(A Lite BERT)는 이름 그대로 더 가벼운 버전의 BERT 모델이다.

메모리와 학습 시간이 비대해지는 상황에서, 성능은 올리고 자원은 줄이는 새로운 task를 제안하였다.

해당 task는 Factorized Embedding Parameterization이다.

 

GPT나 BERT는 Self Attention Block을 계속 쌓으면서 성능을 올리는 모델들이다.

DL 측면에서 Layer를 쌓는 것이 유의미한 정보를 추출하는 과정이기 때문이다.

이때 Input과 Output의 크기는 hidden state vecor와 동일해야 행렬곱 연산이 가능하다.

즉 hidden layer size가 크면 클수록 계산량이 배로 늘어난다.

그렇다고 차원 수를 너무 줄이면 정보를 표현할 수 없는 문제가 있다.

 

Vocabulary size를 V, Hidden state dimension을 H, Word embedding dimension을 E라고 할 때,

기존 Input size는 V * H만큼의 값을 필요로 한다.

행렬 분해를 통해 V * H를 (V * E) * (E * H)로 쪼갠다면, 필요한 값은 V * E + E * H로 줄어든다.

그럼 굳이 처음 단어들의 embedding을 고차원으로 할 필요가 없다는 말이다.

이를 수학적으로 바라보면 Low Rank Matrix Factorization 혹은 Low Rank Approximation이라고 한다.

 

간단한 예시로 hidden state dimension이 768이고 단어가 30,000개 있다고 해보자.

그리고 단어별 embedding dimension은 가볍게 128 차원으로 embedding 했다 가정하자.

그럼 원래 계산량은 30,000 * 768로 23M이 나온다.

행렬 분해 후 계산량은 (30,000 * 128) + (128 * 768)로 약 4M에 불과하다.

 

ALBERT - Cross Layer Parameter Sharing

ALBERT는 input word embedding 외에 parameter 측면에서도 최적화를 시도했다.

Self Attention에서 학습해야 하는 parameter들은 linear transformation에 필요한 가중치 행렬들이다.

더 자세하게 말하면 Multi Head 개수만큼의 가중치 행렬 세트들(W^Q, W^K, W^V)과

출력 dimension을 맞추기 위한 output layer의 linear transformation용 가중치 행렬(W^O)이 여기에 속한다.

만약 한 Block에서 12개의 Head를 사용한다고 하면 12개만큼의 가중치 행렬들이 있는 것이다.

이건 하나의 Self Attention Block에서 이야기이고, Block을 쌓을 수록 배로 늘어난다.

 

출처: https://arxiv.org/pdf/1909.11942

 

학습할 parameter 수가 너무 많아지니, 이것들을 공유하자는 아이디어에서 출발했다.

ALBERT는 4개로 나누어 parameter sharing을 진행했다.

ㆍ all-shared: 모든 파라미터를 공유하는 방법

ㆍ Shared-attention: attention의 파라미터만 공유하는 방법

ㆍ Shared-FFN: feed-forward network 파라미터만 공유하는 방법

ㆍ not-shared: 모든 파라미터를 공유하지 않는 방법, 기존 BERT 모델이다.

 

그랬더니 all shared에서 parameter 수는 확연히 줄었지만, 성능은 크게 하락하지 않은 모습을 보였다.

이렇게 여러 개의 Transformer layer가 서로 다른 parameter를 갖지 않고,

하나의 layer 가중치를 반복해서 재사용하는 구조를 Cross Layer Parameter Sharing 방법이라고 한다.

 

ALBERT - Sentence Order Prediction

출처: https://amitness.com/posts/albert-visual-summary

 

Low Rank Matrix Factorization과 Cross Layer Parameter Sharing을 통해 자원을 절약했다.

ALBERT 여기에 이어 SOP라는 방법으로 모델 성능을 향상시켰다.

BERT는 MLM(Masked Language Model)과 NSP(Next Sentence Prediction)를 통해 학습했다.

하지만 후속 연구들에서 NSP는 BERT에서 큰 의미가 없는 방법이라고 자주 거론되었다.

 

Fine tuning을 하며 MLM로만 학습을 해보니 NSP에는 문제가 있었다.

NSP는 단순 문장 추출(random)을 기반으로 학습했다.

원래 두 문장 중 하나를 아예 다른 문장으로 바꿨기 때문에, 두 문장의 맥락이 너무 다르다든가

연결적 의미가 아니라 표면적 차이로만 비교하기 때문에, 문장 간 의미 관계를 학습하지 못했다.

요약하면, 너무 쉬웠다는 말이다.

 

그래서 보다 어려운 구조적 관계를 학습하기 위해 SOP라는 방법을 고안했다.

SOP(Sentence Order Prediction)는 연속한 문장의 순서를 바꿔, 이 순서가 맞는지 틀린지 판단하는 task다.

두 문장의 순서가 올바르다면 YES, 아니라 순서가 바뀌었다면 NO를 뱉는다.

따라서 NSP에 비해 문장의 흐름을 파악해야지만 맞출 수 있는 문제로 바뀐 것이다.

 

출처: https://arxiv.org/pdf/1909.11942

 

위 표는 ALBERT 논문에서 None(only MLM), NSP, SOP의 성능을 비교한 표다.

None과 NSP는 실제로 큰 차이가 없고, 때때로 None이 더 점수가 높은 경우도 있다.

SOP를 pretraining task로 적용한 경우, 대부분의 NLP에서 성능이 높아짐을 확인할 수 있다.

 

출처: https://arxiv.org/pdf/1909.11942

 

위는 GLUE 데이터 셋에 대한  ALBERT 모델의 벤치마크 결과다.

전반적으로 모델은 가벼워졌지만, 성능은 향상한 것을확인 할 수 있다. 

 

P.S.

ALBERT의 input parameter 경량화 부분에서 행렬을 쪼개는 방식을 설명할 때

Low Rank Matirx Factorization 혹은 Low Rank Approximation이라고 언급했다.

하지만 사실 이 두 가지 개념은 동일하지 않고, 다른 개념이다.

ALBERT는 Low Rank Matrix Factorization이 맞는 말이다.

 

Low Rank Maxtirx Factorization은 용어 그대로 정확히 행렬을 분해해야 한다.

주어진 행렬을 낮은 차원 행렬들의 곱으로 정확하게 표현할 수 있어야 한다.

대게 모델 학습에서 자원을 줄이거나, 새로운 의미를 찾기 위해 자주 사용한다.

 

이에 비해 Low Rank Approximation은 용어 그대로 근사값이면 괜찮다.

주어진 행렬을 가장 비슷한 낮은 차원 행렬로 근사하는 것이다.

차원을 축소하거나 압축해야 할 때 사용한다.

 

표로 비교하자면 다음과 같다.

  Low Rank Matrix Factorization Low Rank Approximation
정의 주어진 행렬을 낮은 rank 행렬들의
곱으로 정확하게 분해 
원래 행렬을 가장 비슷한
낮은 rank 행렬로 근사 
목적 구조적 표현
(잠재 변수 찾기, 모델 학습)
정보 압축, 근사, 차원 축소
정확성 손실 없이 정확하게 맞춤 정확하지 않아도 되는 근사
예시 BERT의 factorization,
추천 시스템의 MF
SVD truncation, PCA, LSA
수학 표현 A = UㆍV^T A ≒ U_k Σ_k V^T_k

 

'공부 > BoostCourse 자연어 처리' 카테고리의 다른 글

23. NLP Trends - ELECTRA  (0) 2025.04.03
21. NLP Trends - GPT 2, GPT 3  (1) 2025.04.01
20. NLP Trends - BERT 2  (0) 2025.03.31
19. NLP Trends - BERT 1  (0) 2025.03.28
18. NLP Trends - GPT 1  (0) 2025.03.27

Advanced Self Supervised Pre Training Models

이제껏 살펴본 GPT 1과 BERT는 모두 Advanced Self Supervised Pre Training Model들이다.

이는 라벨 없이 대규모 데이터를 사용해 언어, 비전, 멀티모달(Multimodal) 등을 학습하는 방법이다.

이에 GPT 1의 발전형인 GPT 2와 GPT 3의 양상을 살펴본다.

 

GPT 2

  GPT 1 GPT 2
출시 시기 2018년 6월 2019년 2월
파라미터 수 117M 117M, 345M, 762M, 1.5B
레이어 수 12 최대 48
학습 데이터 BooksCorpus WebText
학습 데이터 분량 최대 7천만 문장 최대 8백만 '문서'
처리 단위(BPE) Unicode 기준 subword Byte 단위 subword
학습 방식 Two-stage
(Pre tain + Fine tune)
One-stage
(Zero/Few-shot Task)
목표 언어 이해 향상 (GLUE 등) 범용 언어 생성

 

GPT 2는 GPT 1과 비교해서 구조적으로는 큰 차이가 없다.

GPT 1은 LayerNorm을 sub layer 출력 후 적용했지만, GPT 2는 입력에 먼저 적용한다.

이를 pre-norm 구조라고 한다.

이는 ResNet의 pre-activation 구조와 유사하고, 학습 안정성을 향상하고 gradient 흐름을 개선한다.

추가로 GPT 2에서 pre-norm 외에 Tranformer 블록 전체 마지막에 추가로 LayerNorm을 한 번 더 삽입했다.

 

Residual Connection(Add 연산)의 가중치 초기화를 조정하기도 했다.

블록 개수(깊이)를 n이라고 하면, 초기 가중치 scale을 1 / sqrt(n)으로 두었다.

Residual 누적으로 인해 생길 수 있는 gradient vanishing / exploding을 방지한 것이다.

 

GPT 2는 구조를 약간 변경하면서 더 많은 데이터, 더 많은 파라미터, 더 많은 레이어를 쌓았다. 

또한 더 좋은 품질의 데이터를 입력으로 학습을 진행했다.

가령, GPT 2에서는 Reddit 같은 플랫폼에서 추천이 많은 답변을 참조한다든가

해당 답변에 외부 링크가 있다면 타고 들어가, 공신력 있는 데이터를 사용한다든가 했다.

 

출처: The Natural Language Decathlon:Multitask Learning as Question Answering

 

GPT 2의 가장 큰 변경은 범용 추론일 것이다.

긍정/부정 예측 task와 질의응답 답변 생성 task가 있다고 해보자.

예를 들어 주어진 문장이 긍정인지 부정인지 예측하려면, [CLS]를 활용해 binary classification을 해야 하고,

답변을 생성하려면 지문과 질문을 [SEP]으로 잇고 Attention으로 다음 단어를 예측해야 한다.

요점은 두 개의 자연어 처리 상황이 구조가 달라진다는 것이다.

 

하지만 어떤 논문에서 모든 종류의 자연어 처리 task를, 질의응답(QA) 형태로 바꿀 수 있다고 보았다.

해당 연구에서는 다양한 downstream task에 대해, 하나의 통합 모델로 학습을 한 사례를 보였다.

예를 들어 감정 분석 task에 영화 설명만 넣는 게 아니라, "이 문장은 긍정일까? 부정일까?"를 마지막에 더해준다.

이런 식으로 모든 task를 QA의 형태로 바꾸고, QA에 답변하는 형태로 학습하는 것이다. 

이것이 GPT 2의 Motivation(혹은 Background)이다.

그렇게 개선한 GPT 2의 가장 큰 특징은, 추가 학습이 없는 zero-shot 방법으로 여러 자연어 task를 수행한다.

 └ Zero Shot Learning: 특정 task에 대해 Fine tuning 없이 문제의 설명(prompt)만을 보고 답을 맞추는 것

 

출처: https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf

 

위의 표는 GPT 2 논문에서 발표한 zero shot 평가 결과이다.

SOTA는 당시 다른 모델들이 fine tuning하여 얻은 최고 성능 점수를 의미한다.

참고로 PPL, BPB, BPC 점수 측정은 낮을수록 좋고, ACC 점수 측정은 높을수록 좋다.

살펴보면 1BW 데이터셋을 제외하고 모든 부분에서 GPT 2의 zero shot이 우위를 점하고 있는 것을 볼 수 있다.

 

그 밖에도 QA task를 진행한 결과 f1 score에서 55%를 달성할 수 있었다.

55%라는 점수는 높은 점수는 아니지만, 추가 학습을 할 경우 89%까지 성능이 올라감을 보여주었고

추가 학습이 없다는 것은, 더 이상 데이터를 수집하지 않기에 시간과 인적 자원을 절약할 수 있다는 말이다.

 

GPT 3

출처: https://www.sigmoid.com/blogs/gpt-3-all-you-need-to-know-about-the-ai-language-model/

 

GPT 2에서 GPT 3로의 발전은 구조 측면이 아니라 데이터다.

위 그래프는 언어 모델별로 사용하는 parameter 수를 표현한 것이다.

최대 1.5B의 parameter를 사용하던 GPT 2와 달리 GPT 3는 157B parameters를 사용한다.

또한 Transformer의 Self Attention Block을 96개나 쌓고, Batch size는 3.2M로 더 키웠다.

이렇게 쌓은 GPT 3는 Few shot 분야에서 가능성을 확실히 보여주었다.

그 여파로 인공지능 학회 NeurIPS에서 2020년 Best Paper Award를 수상하기도 했다.

자세한 차이는 GPT 3 논문을 직접 참고해보자.

 

출처: https://arxiv.org/pdf/2005.14165

 

Zero shot은 아무 예시도 없이 taks를 수행하는 방법이고,

One shot은 단 하나의 예시를 보여주고 task를 수행하는 방법이고,

Few shot은 몇 개의 예시를 보여주고 task를 수행하는 방법이다.

이는 별도의 Fine tuning 과정을 거치지 않는다는 공통점을 가지고 있다.

 

 

출처: https://arxiv.org/pdf/2005.14165

 

GPT 3는 fine tuning없이 여러 downstream task에 모델을 그대로 사용한다

n shot에서 예시를 몇 개 같이 던져주면, 동적으로 패턴을 빠르게 학습하여 task를 수행한다.

따라서 아무런 예시가 없는 zero shot보다는 one shot, few shot에서 성능이 더 좋음을 볼 수 있다.

실제로 모델 사이즈(paramete 개수)를 키울수록 성능이 올라가는 것을 볼 수 있다.

큰 모델을 사용할수록 동적 적응 능력이 훨씬 뛰어나다는 말과 같다.

'공부 > BoostCourse 자연어 처리' 카테고리의 다른 글

23. NLP Trends - ELECTRA  (0) 2025.04.03
22. NLP Trends - ALBERT  (0) 2025.04.02
20. NLP Trends - BERT 2  (0) 2025.03.31
19. NLP Trends - BERT 1  (0) 2025.03.28
18. NLP Trends - GPT 1  (0) 2025.03.27

MRC

MRC(Machine Reading Comprehension)는 QA(Question Answering)의 한 형태로,

기계 독해를 기반으로 지문과 질문이 주어졌을 때, 정답을 내놓는 NLP 과제이다.

정확하게는 답을 포함한 지문(Document / Context)에서 답을 찾는 task이다.

 

MRC는 보통 다음과 같은 순서를 따른다.

1. 질문과 문단 전체를 [SEP] token을 활용해, 하나의 입력 문장으로 만든다.

2. BERT를 통해 각 단어(token)별 embedding vector를 얻는다.

3. 단어(token)별 embedding vector를 이용해 답의 위치를 찾는다.

    └ 단어(token)별로 답의 시작인지 아닌지, 답의 끝인지 아닌지를 학습한다.

4. 경우에 따라 답을 찾을 수 없는 경우 [CLS] token으로 정답을 결정(Answer / No Answer)한다.

 

SQuAD

출처: https://paperswithcode.com/dataset/squad

 

SQuAD(Stanford Question Answering Dataset)는 스탠포드에서 구축한 데이터 셋이다.

이는 NLP에서 가장 보편적으로 사용하는 MRC 데이터 셋이다.

 

출처: https://paperswithcode.com/dataset/squad

 

해당 데이터는 Crowdsourcing(크라우드 소싱)을 통해 구축한 데이터다.

따라서 특정 질문에 대해 답이 여러 종류가 있을 수 있다.

위 사진에서 3번째 질문의 경우, 5개의 답안이 있는데 전부 ground truth로 간주한다. 

BERT는 5개 중에서 아무거나 예측해도 Answer 처리한다는 말이다.

 

전체 단어의 embedding vector들을 Fully Connected Layer 두 개를 두어 scalar로 바꾸는 fine tuning을 거친다.

이후 전체 단어의 scalar 값에 softmax를 씌워서 각 확률을 예측한다.

FC 1개는 정답의 시작 위치를 예측하고, 다른 FC 1개는 정답의 마지막 위치를 예측하도록 학습한다.

이런 MRC를 위한 SQuAD에는 v1.1과 v2.0이 존재한다.

 

v1.1: 정답이 항상 지문에 존재한다. 정확히 답을 찾아내야 한다.

v2.0: 일부 질문은 정답이 지문에 없다. 이 경우 [CLS] token을 사용하여 No Answer를 도출해야 한다.

다양한 모델 조합을 SQuAD에 테스트한 결과는 링크에서 확인할 수 있다.

 

SWAG

출처: https://paperswithcode.com/dataset/swag

 

SQuAD 말고 MRC를 위한 또 다른 데이터 셋인 SWAG가 있다.

SWAG(Situations With Adversarial Generations)는 상황 기반 문장 추론을 위한 multiple choice dataset이다.

 └ 쉽게 말하면 어떤 문장이 있을 때 다음에 올 문장을 고르는 task다.

2018년 University of Washington에서 발표했고, 상식 추론(commonsense reasoning) 능력을 평가하기 위해 설계했다.

기존 모델들이 패턴만 따라가지 못하도록 adversarial filtering을 적용했다.

 └ Adversarial Filtering: 모델이 패터만 보고 푸는 쉬운 후보를 제거하고, 헷갈리는 오답 선택지만 남기는 과정

 

위의 사진은 다양한 downstream task에 대해 BERT를 Fine tuning하는 사례들이다.

SQuAD와 유사하게 동작하는데 질문 문장과 각 선택지를 [SEP]로 이어서 조합을 만든다.

모든 조합에 대해서 [CLS]로 나온 vector를 FC를 거쳐서, 선택지 마다 하나의 scalar 값을 뽑아낸다.

Scalar값들을 softmax 함수와 통과시켜 가장 높은 값 하나를 정답으로 도출한다.

 

Ablation Study

Ablation Study는 ML이나 DL 연구에서 모델 구성 요소가 얼마나 중요한지 확인하는 실험 방식이다.

Ablation(제거)라는 의미답게, 구성 요소 중 일부를 제거하거나 바꿔가며 성능을 측정하여 분석한다.

위 사진은 Transformer(BERT) 모델의 Parameter 수를 늘려가면서 Accuracy를 측정한 그래프이다.

 

110M(1억 1천만)개부터 340M(3억 4천만)개까지 parameter를 점점 더 늘려가면서 확인했다.

그랬더니 다양한 downstream task에 대해서 성능이 끊임없이 좋아지는 것을 확인할 수 있다.

즉 GPU 자원이 허락하는 한 모델 크기를 가능한 크게 키우는 것이 좋은 개선이라는 말이다.

'공부 > BoostCourse 자연어 처리' 카테고리의 다른 글

22. NLP Trends - ALBERT  (0) 2025.04.02
21. NLP Trends - GPT 2, GPT 3  (1) 2025.04.01
19. NLP Trends - BERT 1  (0) 2025.03.28
18. NLP Trends - GPT 1  (0) 2025.03.27
17. Transformer - Positional Encoding  (1) 2025.03.26

BERT

MLM 방법, 출처: https://www.scaler.com/topics/nlp/pre-training-bert/

 

BERT는 GPT와 동일하게 다음 단어를 예측하는 Language Modeling Task에 Pre-Trained한 모델이다.

하지만 GPT는 이후에 나올 단어를 보지 않고 예측하기에 비교적 성능이 떨어진다.

그래서 두 가지의 unsupervised task를 사용하여 학습한다.

하나는 Masked Language Model이고, 다른 하나는 Next Sentence Prediction이다.

 

이를 개선하여 BERT는 앞과 뒤 단어를 모두 보고, 다음 단어를 예측한다.

학습하는 과정에서 전체 단어를 주는 대신, 일부 단어에 mask를 씌워 Pre-training한다.

이를 MLM(Masked Language Model)라고 부른다.

 

전체 문장에서 [MASK] token으로 바꿀 비율은 사용자가 정하는 hyper parameter에 해당한다.

여러 논문의 검토에 따르면 보통 15%가 최적의 성능을 발휘한다.

하지만 15%의 단어를 전부 [MASK] 로 바꿔버리면 그건 나름대로 성능에 문제가 생긴다.

실제 downstream task에서는 [MASK]가 없는 문제이기 때문이다.

그래서 15%의 단어를 80 / 10 / 10의 비율로 나눠 따로 처리한다.

80%는 [MASK] token으로 바꾸고, 10%는 무작위 단어로 바꾸고, 10%는 기존 단어를 유지한다.

이 과정에서 BERT는 문맥을 파악하는 능력을 기른다.

 

NSP 방법, 출처: https://www.scaler.com/topics/nlp/bert-next-sentence-prediction/

 

단어를 예측하는 task 이외에 문장 level에 대응하기 위해 NSP 방법을 사용한다.

문장 A와 B를 이어 붙여서 문장 사이의 관계를 학습하게 된다.

이때 B를 50% 확률로 관련 있는 문장(IsNextLabel) 또는 관련 없는 문장(NotTextLabel)을 사용한다.

 

여기서는 <CLS>와 <SEP> 두 가지의 token을 사용한다.

CLS(special Classification token)는 전체 문장의 시작에 가장 첫 번째 token으로 삽입한다.

Classification task에서는 사용하지만, 그렇지 않을 경우는 무시하는 token이다. GPT의 <Extract>와 유사하다.

SEP(special Separator token)는 모든 각 문장의 마지막 token으로 삽입한다.

여러 문장이 있을 경우 문장을 구별하는 용도의 token으로 사용한다. GPT의 <Delim>과 유사하다.

 

BERT 마지막에 binary classification용 output layer 하나를 추가로 둬서 True인지 False인지 출력한다.

이때 [CLS] token의 encoding vector를 output layer의 입력으로 사용한다.

Ground truth는 인접인지(IsNext) 혹은 아닌지(NotText)이다.

 

출처: https://hwiyong.tistory.com/392

 

BERT는 총 세 가지 Embedding을 통해서 문장을 표현한다.

첫 번째는 Token Embedding으로 위에서 설명한 특수 token(CLS, SEP)을 사용해서 문장을 구분한다.

두 번째는 Segment Embedding으로 문장을 더 쉽게 구분하게 해주는 embedding이다.

he라는 단어는 전체 기준으로는 7번째지만, 본인이 속한 문장에서는 첫 번째 단어다.

전체가 아닌 각 문장 level에서 위치를 반영하는 embedding이 segment embedding이다.

따라서 문장 하나는 vector가 동일하다.

세 번째는 Position Embedding으로 Transformer 구조에서 사용하는 Positional Encoding이다.

 

Fine Tuning Process

출처: https://arxiv.org/pdf/1810.04805

 

BERT도 GPT와 동일하게 fine tuning을 지원하는 언어 모델이다.

Output layer를 제외하고 다른 부분은 모두 동일한 모델 구조를 사용한다.

참고로 Pre-training과 Fine-tuning 과정을 합쳐서 Tranfer-tuning이라고 한다.

 

출처: https://arxiv.org/pdf/1810.04805

 

Fine tuning하는 4가지 상황이 존재한다.

(a) Sentence Pair Classification Tasks

두 문장을 함께 encoding해서 관계를 판단할 때 사용한다. CLS token의 vector로 판단한다.

NLI(자연어 추론), STS(문장 유사도) 등의 상황에 사용한다.

 

(b) Single Sentence Classification Tasks

한 문장의 특성을 분류할 때 사용한다. CLS token의 vector로 판단한다.

Sentiment Analysis(감정 분석), Topic Classification(주제 분류) 등의 상황에 사용한다.

 

(c) Question Answering Tasks

질문과 context(문서)를 하나의 sequence 입력으로 사용해, 정답 구간을 찾을 때 사용한다.

SQuAD(데이터셋), Reading Comprehension(기계 독해) 등의 상황에 사용한다.

 └ SQuAD(Standford Question Answering Dataset)

 

(d) Single Sentence Tagging Tasks

입력 sequence에 대해 token 단위로 label을 예측할 때 사용한다.

NER(개체명 인식), PoS Tagging(품사 태깅) 등의 상황에 사용한다.

 

BERT Summary

출처: https://sdkim817.wordpress.com/2021/01/11/bert/

 

BERT는 구조 크기에 따라서 크게 두 가지 버전의 모델을 제공한다.

L은 Block 수, H는 encoding vector 차원 수, A는 Head 수일 때

BASE 모델은 L12 H768 A12의 구조를 가지고, LARGE 모델은 L24 H1024 A16의 구조를 가진다.

또한 Word별 embedding 입력을 하지 않고, 더 잘게 쪼개서 subword level에서 embedding을 진행한다.

가령, pre-training이라는 단어를 pre / training으로 쪼개는 것과 같다.

Segment embedding과 Positional embedding 학습으로 최적화하였다.

 

GPT는 바로 다음 단어 에측 수행이기에, 다음 접근을 허용해서는 안 됨 / Maksed Self Attention / Decoder

BERT는 모든 단어에 접근이 가능 / Encoder에서 사용하는 Self Attention

 

GPT와는 다르게 양방향(Bidirectional)이라는 특징을 가집니다.

양방향이란 토큰의 순차적인면 뿐 아니라 역순의 정보 또한 학습을 한다는 것입니다.

 

  BERT GPT 1
Training data size 2,500M words 800M words
Embedding Token, Segment, Position Token, Position
Special token CLS, SEP Extract, Delim
Batch size 128,000 words 32,000 words
Fine tuning learning rate task specific 5e-5

GLUE 데이터셋을 사용한 Benchmark


그 밖에 BERT와 GPT 1의 특징 차이를 비교하면 위와 같다.

하단의 표는 유명한 데이터 benchmark인 GLUE를 사용하여 평가한 점수다.

'공부 > BoostCourse 자연어 처리' 카테고리의 다른 글

21. NLP Trends - GPT 2, GPT 3  (1) 2025.04.01
20. NLP Trends - BERT 2  (0) 2025.03.31
18. NLP Trends - GPT 1  (0) 2025.03.27
17. Transformer - Positional Encoding  (1) 2025.03.26
16. Transformer - Block Based Model  (0) 2025.03.25

Recnt Trends

최근 NLP 동향이라고 하지만 여기서 주의할 점이 하나있다.

Attention Is All You Need 논문으로 Transformer 모델을 제안한 게 2017년,

밑에서 작성하겠지만 GPT1과 BERT 모델이 세상에 나온 게 2018년이다.

그리고 강의가 2022년에 올라왔으니, 글을 작성하는 오늘(25년 3월27일) 기준으로는 다소 옛날이다.

현시점에서의 최근 NLP 동향이 아니라는 것이다.

하지만 과거 기준으로 미래라는 건 현재 기준으로 현재에 해당한다.

단순히 옛 것으로 치부하고 넘기지 말고, 정말 현재에 그렇게 발전해왔는지? 아니라면 왜 그런지?

예측보다 부족한 건지? 과거의 예상을 뛰어넘고 더 발전했는지? 고민하며 살펴볼 필요가 있다.

 

ㆍ Transformer와 Self Attention Block은 NLP 외에 다른 분야의 범용 Encoder와 Decoder로 자리 잡았다.

ㆍ Self Supervised 학습 프레임워크를 통해 다양한 NLP 작업을 발전시켰다.

     └ BERT, GPT3, XLNet, ALBERT, RoBERTa, Reformer, T5, ELECTRA 등 

ㆍ 추천 시스템, 신약 개발, 컴퓨터 비전 등 다른 분야에서도 Self Attention, Self Supervised 방식을 도입한다.

ㆍ NLG에서는 여전히 매 time step마다 가장 높은 확률 단어 하나씩 생성하는 Greedy Decoding에 의존한다.

 

Self Supervised Pre Training Models - GPT 1

출처: https://paperswithcode.com/method/gpt

 

Transformer 모델을 활용하여 만든 대표적인 AI 모델이 GPT다.

GPT 1은 12개의 Attention Block 구조를 가지며, 많은 분야에서 두루 사용할 수 있는 모델이다.

입력과 출력 sequence가 따로 없이, 입력 문장의 다음 단어를 예측하는 Language Modeling으로 pre-training했다.

이때 다양한 Special Token을 활용해서, 하나의 구조로 여러 task에 사용할 수 있는 통합 모델로 설계했다.

 

GPT 1에는 Extract Token과 Delimiter Token이라는 새로운 token이 두 가지 있다.

Extract Token은 텍스트에서 속성을 추출해야 하는 경우, 문장 뒤에 넣어 Query 역할을 하여 필요한 정보를 뽑는다.

Delimiter Token은 여러 문장이 필요한 task에서 문장 사이에 넣어 하나의 sequence로 이어주는 역할을 한다.

이렇게 구성된 입력을 기반으로, 다음 단어를 예측하는 task도 병행 수행이 가능하다.

 

예를 들어 Input으로 'The movie was boring and too long. <Extract>'가 주어졌다고 하면,

GPT 1은 감정 분석 주제라고 판단하여 negative라는 정답을 예측한다.

또는 'Sentence 1: A man is playing a guitar <Delimiter> Sentence 2: A person is performing music <Extract>'가 있다면,

GPT 1은 이를 NLI(문장 관계 판단) 주제라고 판단하여 entailment라는 정답을 예측한다.

물론 positive / negative나 entailment / contradiction 등의 답 외에 이후 단어를 더 생성하는 것도 가능하다는 말이다.

 

GPT 1은 원래 다음 단어 예측만을 하는 Text Prediction을 위한 모델로 학습했다.

하지만 이 구조를 Text Classification과 같은 downstream task에 fine-tuning 할 수 있도록 설계했다.

 └ Upstream task: 주로 라벨이 없는 대규모 데이터의 사전 학습용 과제

 └ Self Supervised Learning: 입력의 일부를 가리고 예측하는, upstream task를 수행하는 학습 방식

 └ Pretrained Model: 위 과정을 통해서 만든 기초 언어 능력이 있는 모델

 └ Downstream Task: 실전에서 사용하고자 하는 구체적인 과제 (감정 분석, 질의 응답, 문서 분류, 요약, 분류 등)

 └ Fine Tuning: 사전 학습 모델(pretrained model)을 실제 문제(downstream task)에 맞게 조정하는 과정

 

예를 들어 감정 분석을 하던 GPT에게 뉴스를 던져주고 어떤 카테고리인지 분류하라고 명령을 했다.

긍정/부정만을 판단하던 모델은 이게 경제인지 스포츠인지 과학인지 알 수 없다.

즉 긍정/부정 task와는 달리, 카테고리를 구분하는 문제(downstream task)를 위해서는 모델을 조정해야 한다.

이것을 Fine Tuning이라고 한다.

 

Fine Tuning을 위해서는 기존의 '다음 단어 예측 output layer'를 우선 제거한다.

그리고 최종 직전 단계에서 나온 단어별 hidden representation(encoding) vector를 활용한다.

분류를 위한 '새로운 output layer'를 새롭게 추가하고, 해당 layer의 가중치를 초기화한다.

 └ 이 layer의 가중치를 초기화하는 것을 Random Initialization이라고 한다.

그리고 전체 모델을 downstream task 데이터로 다시 학습한다.

 

이때 마지막 layer는 새롭게 가중치가 부여되어 충분한 학습이 필요하지만, 앞부분은 그렇지 않다.

따라서 기학습된 부분(Pretrained)은 learning rate를 작게 설정해서 학습한다.

그럼 기존 일반 언어 지식은 유지하면서, 새로 추가한 layer만 빠르게 적응하는 방식으로 학습을 진행한다. 

GPT 1은 Self Supervised Learning 방식으로 '대규모 비라벨 텍스트'에 대해 '다음 단어 예측'만으로 만들었다.

즉 이렇게 사전 학습한 모델은 소규모 라벨 데이터만으로 fine tuning이 쉽게 가능하다.

이런 방식으로 다양한 downstream task에 적용할 수 있다.

 

출처: https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf

 

특정 task만을 위해 집중한 기존 모델과 소량의 데이터로만 fine tuning한 GPT 1 모델을 비교한 표이다.

다양한 task에서 다양한 모델들과 결과를 비교했지만, 전체적으로 성능이 우위이다.

특히 ELMo나 CAFE 같이 주목받던 다른 언어 모델보다 좋은 성능을 보여주었다.

 └ ELMo(Embeddings from Language Model): 문맥에 따라 다르게 embedding하는 Bidirectional LSTM 기반 모델

 └ CAFE(Compare, Align, Factorized Encoder): 문장 관계 추론 파악을 위한 모델 

'공부 > BoostCourse 자연어 처리' 카테고리의 다른 글

20. NLP Trends - BERT 2  (0) 2025.03.31
19. NLP Trends - BERT 1  (0) 2025.03.28
17. Transformer - Positional Encoding  (1) 2025.03.26
16. Transformer - Block Based Model  (0) 2025.03.25
15. Transformer - Multi Head Attention  (0) 2025.03.24

Positional Encoding

Attention이라는 계산 방법 특성상 위치 정보는 representation vector에 포함하지 않는다.

예를 들어 [Stars, shine, bright]라는 입력이 있을 때 이 순서대로 Attention을 수행하는 것과

[bright, shine, Stars]라고 입력을 뒤집어서 Attention을 수행하는 것은 동일하다.

왜냐하면 입력 단어 Q와 문장 전체 (K, V)의 값 자체를 Linear Transformation하고 Weighted Sum하기 때문이다.

쉽게 말하면 곱셈과 덧셈은 순서가 바뀌어도 결과가 같다는 말이다.

 

Attention의 이러한 점을 보안하기 위해, 위치 정보 vector를 더해서 encoding을 진행한다.

가령 [Eyes, speak, truth]라는 입력의 초기 embedding을 [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]라고 해보자.

그럼 Q로 사용할 단어 위치에 1000을 더해주는 것이다.

 Eyes는 첫 번째 단어이기에 [1001, 2, 3]으로 바뀌고, speak는 두 번째 단어라 [4, 1005, 6]으로 바뀌는 식이다.

만약 [truth, speak, Eyes]라는 입력에서는 Eyes는 [1, 2, 1003]이라는 다른 vector를 가지게 된다.

이런 식으로 순서를 구분할 수 있는 unique한 상수 vector를 더하는 것을 Positional Encoding이라고 부른다.

 

출처: https://www.blossominkyung.com/deeplearning/transfomer-positional-encoding#410163a1-cf3a-4222-9f32-e5d0bb8982c5

 

당연하게도 위치 정보에 단순 1000을 더하는 방식은 사용하지 않는다.

위치 정보를 더해주기 위해서는 지켜야 할 두 가지 규칙이 있다.

 

1. 모든 위치 정보는 sequence나 Input에 관계없이 고유하면서 동일한 식별자를 가진다.

그래야 모델이 위치 자체의 패턴을 학습할 수 있기 때문이다.

즉 sequence가 바뀌더라도 위치 embedding은 동일하게 유지해야만 한다.

이런 이유 때문에 0부터 1까지 값을 Normalization 하는 방식의 embedding도 불가능하다.

Sequence 길이에 따라 같은 위치여도 위치 vector가 달리지기 때문이다.

출처: https://www.blossominkyung.com/deeplearning/transfomer-positional-encoding#410163a1-cf3a-4222-9f32-e5d0bb8982c5

 

2. 모든 위치 정보는 너무 크면 안 된다.

위칫값이 너무 커져버리면 단어 간의 상관관계나 유추할 수있는 정보를 왜곡할 수 있게 된다.

이 경우 Attention 과정에서 제대로 학습이 안 될 수 있기 때문이다. 

이런 이유 때문에 n번째 token에 [n] * (token index)처럼 정숫값을 부여할 수도 없다.

 

출처: https://www.blossominkyung.com/deeplearning/transfomer-positional-encoding#410163a1-cf3a-4222-9f32-e5d0bb8982c5

 

때문에 Sine 함수와 Cosine 함수를 사용한다.

두 함수는 주기 함수이기 때문에 특정 position마다 일정한 값을 가지게 된다.

또한 -1에서 1 사이를 반복하는 주기 함수이기 때문에 값이 너무 커지지 않는다.

 

이때 Sigmoid나 tanh처럼 특정 구간의 값으로 변환하는 함수를 사용해도 되지 않나? 의문이 들 수 있다.

활성화 함수는 주기 함수가 아니기에 sequence 길이가 길어지면, 위에서 말한 Normalization의 문제가 발생한다.

더욱이 위치 vector의 차이가 미미하기에 학습에 문제가 있을 수 있다.

 

여기서 한 가지 의문이 더 들 수 있다.

위치 vector는 고유해야 하는데 주기 함수라면 같은 값이 생길 수도 있지 않는가?에 대함이다.

놓치지 말아야 할 점은 positional encoding은 scalar가 아니라 vector라는 점이다.

그것도 단어와 같은 차원을 가지는 vector라는 것이다.

따라서 서로 다른 주기(혹은 frequency)를 갖는 Sine 함수와 Cosine 함수를 번갈아가며 쌓으면 해결할 수 있다.

 

위 그림은 positional encoding을 위해 sine & cosine 함수를 그린 차원의 일부 시각화다.

수많은 차원 중 4부터 7까지 차원만을 발췌하였고, 서로 다른 주기(혹은 frequency)를 가짐을 볼 수 있다.

또한 4차원 6차원은 sine 함수 5차원 7차원은 cosine 함수로, 번갈아 사용하는 것도 볼 수 있다.

 

 

이를 수식으로 나타내면 위와 같다.

pos는 문장에서 단어의 위치, i는 차원 인덱스, d_model은 embedding 차원 수를 의미한다.

상수 10000은 주기 다양성을 확보하고 성능이 뛰어나도록 논문 저자들이 실험을 통해 선택한 값이다.

 └ 지수 분포 형태라서 차원마다 log scale 주기 간격을 갖게 된다.

해당 상수를 바꿔도 되지만 작아지면 주파수 간 간격이 좁아지고, 커지면 너무 느려서 표현력이 떨어질 수 있다.

Positional Encoding 결과를 heatmap으로 시각화한 예시는 위와 같다.

 

Warm up Learning Rate Scheduler

Learning rate에 따른 최적의 loss 탐색 과정(왼쪽), Learning rate scheduler 예시(오른쪽)

 

Gradient Descent나 이보다 발전형인 Adam 등의 과정에서 모두 Learning Rate는 하나의 상숫값이다.

하지만 다른 학습 속도를 높이고, 최종 모델의 성능을 올리기 위해 Learning Rate도 학습 중에 적절히 변경하도록 한다.

이를 Learning Rate Scheduler라고 부른다.

 

Transformer는 처음 학습할 때 가중치가 불안정하게 초기화된 상태다.

이때 너무 큰 learning rate로 시작하면 발산하거나 수렴에 실패한다(왼쪽 그래프의 Large learning rate 상황).

그래서 처음 일정 step 동안은 learning rate를 점진적으로 증가시킨다.

이 과정을 Warm up 단계라고 부른다.

오른쪽 그래프에서 x축(iter)에 따라서 peak까지 올라가는 부분에 해당한다.

 

이후 특정 iter(혹은 epoch)까지 도달하거나, 어느 정도 학습을 진행한 후에는 다시 학습률을 줄인다.

계속해서 learning rate를 늘리거나 고정값으로 학습을 진행한다면, 좋은 영역에 더 들어가지 못하게 된다.

따라서 큰 보폭 대신 미세 조정하는 부분이 필요하다.

이 과정을 learning rate decay라고 부른다.

이때 얼마나 어떻게 learning rate를 줄일지에 대해서도 많은 방법이 있다.

 

 

이를 수식으로 나타내면 위와 같다.

d_model은 embedding 차원 수, step은 현재 학습 단계, warmup_steps는 워밍업 단계 수를 의미한다.

 

High Level View

Transformer 전체 구조(왼쪽), Encoder와 Decoder 측면에서의 동작 과정(오른쪽)

 

Transformer의 전체 구조에 대해서 잠시 짚고 넘어가보자.

입력을 받고 이를 embedding한다. 그 후 Positional Encoding하여 위치 정보를 추가한다.

위치 정보까지 추가한 vector를 Q, K, V로 나누어 Multi Head Attention을 수행한다.

Residual Connection과 Normalization으로 안정화하고 성능을 높인다.

Feed Forward Network를 거친 뒤, 한 번 더 안정화를 진행한다.

이 전체 과정을 Block이라고 부르며, 해당 Block의 N번 쌓아 반복한다.

n번 Block의 결과를 n + 1번 Block의 결과로 넣어주고, 최종 N번 Block의 결과를 Decoder의 입력으로 준다.  

Encoder에서 특정 Layer의 Self Attention 패턴을 시각화한 자료다.

위에 있는 단어들이 Query일 때, 아래에 있는 입력 vector에서 어떤 정보를 가져가는지 패턴화했다.

 

단어 making이 Query로 들어갔을 때, 2009, making, more, difficult 같은 단어들과 주요 관계가 있다.

difficult를 보면 여러 색상을 가지는 greed가 존재하는데, 이는 각각 i번째 Head의 Attention을 의미한다.

각 row마다 하나의 Head라는 뜻이다.

분홍색 Head를 보면 2009, making 등의 시간 정보를 취하는 Head로 보이고,

보라색 Head를 보면 making, <EOS> 등의 자기 자신의 정보를 취하는 Head도 보인다.

Colab 코드에서 다른 시각화 패턴 예시들을 확인할 수 있다.

+ Recent posts