요즘 딥러닝 프로그램을 돌리는 컴퓨터가 있는 사무실에 계속 있기 어려운 환경에 있습니다. 그래서, 외부에서 컴퓨터를 온오프할 수 있도록 공유기 원격접속과 컴퓨터 WOL 기능을 켜두었습니다.
그리고 가장 많이 사용하고 있는 jupyter notebook을 원격지에서 사용할 수 있도록 세팅하였습니다.
1. 방화벽 해제 : 먼저 우분투 포트 방화벽 해제 및 공유기 포트포워드 설정을 합니다. >> sudo ufw allow 8888(jupyter notebook의 기본포트로 원하시는 포트로 변경 가능)
2. jupyter notebook 암호 설정 로컬에서만 사용할 경우에는 보통 암호 설정 없이, 토큰을 이용해 접근했었습니다. 그렇지만 원격 접속은 보안을 위해 암호를 설정하는 것이 더 편하고 좋습니다. jupyter 서버 기본 설정을 위한 jupyter_notebook_config.py을 만들고, 패스워드를 설정합니다. >> jupyter notebook --generate-config Writing default config to: /{MyPath}/.jupyter/jupyter_notebook_config.py
>> jupyter notebook password Enter password : **** Verify password : **** [NotebookPasswordApp] Wrote hashed password to /{Mypath}/.jupyter/jupyter_notebook_config.json
반응형
3. jupyter notebook 설정 파일 수정 nano ~/.jupyter/jupyter_notebook_config.py 수정할 코드를 ctrl+w(검색)를 사용해 찾은 후, 수정합니다.
c.NotebookApp.allow_origin = '*' # 외부 접속을 허용합니다. c.NotebookApp.notebook_dir = '작업 절대경로'# 작업경로를 설정합니다. c.NotebookApp.ip = '*' # 외부 접속 포트 전체 오픈. 보안을 위해 특정 IP만 열어두셔도 됩니다. c.NotebookApp.port = '8888' # 외부접속 사용 포트를 설정합니다. c.NotebookApp.password = '<해시화된 패스워드 입력>' # 암호설정시 만들어진 jupyter_notebook_config.json을 nano등으로 열면 해시화된 패스워드를 확인할 수 있습니다. c.NotebookApp.password_required = True # 비밀번호를 요구하도록 합니다. c.NotebookApp.open_browser = False # 서버 pc에서 자동으로 브라우저가 열리지 않도록 합니다.
4. 서버 실행 >> jupyter notebook 이제 외부에서 접속하시면 됩니다. 공유기에서 ddns를 설정한 경우, ddns:포트번호(여기선 8888)을 주소창에 입력하면 접속할 수 있습니다. 그 다음 설정한 비밀번호를 입력하면 로그인이 됩니다.
최근 AI비서, ARS 등 언어 처리에 대한 분야에서 많이 사용되는 딥러닝 아키텍처인 Transformer에 대해 공부중이다. 공부한 내용을 정리하면 좀 더 기억이 잘 되기에 기록을 남겨본다.
RNN과 LSTM 네트워크는 다음 단어 예측, 기계 번역, 텍스트 생성 등의 태스크에서 사용되어 왔었다. 하지만 트랜스포머가 발표된 후에는 트랜스포머에게 자리를 내주었다고 할 수 있다. 트랜스포머가 출연하면서 자연어 처리 분야가 획기적으로 발전하고, 이를 기반으로 한 BERT, GPT-3, T5 등과 같은 아키텍처가 나오게 되었다.
트랜스포머는 RNN에서 사용한 순환 방식을 사용하지 않는다. 대신 셀프 어텐션(self-attention)이라는 특수한 형태의 어텐션을 사용한다. 트랜스포머는 인코더-디코더로 구성된 모델이다. 인코더에 원문을 입력하면 인코더는 원문의 표현 방법을 학습시키고 그 결과를 디코더로 보낸다. 디코더는 인코더에서 학습한 표현 결과를 가지고 사용자가 원하는 문장을 생성한다.
인코더와 디코더의 구체적인 이해는 다음에 하기로 한다.
대신 Transformer를 기반으로 한 BERT의 특징에 대해 정리해 본다.
BERT(Bidirectional Encoder Representation from Transformer)는 구글에서 2018년 발표한 최신 임베딩 모델이다. 대량의 영어 데이터로 학습된 사전학습 언어 모델로 질문에 대한 대답, 텍스트 생성, 문장 분류 등과 같은 태스크에사 가장 좋은 성능을 도출해 자연어 처리 분야에 크게 기여해 왔다.
반응형
BERT의 특징
Masked Language Model(MLM) : 어떤 문장의 특정 부분을 Masking처리하여 모델이 Masking 처리된 부분을 예측하도록 학습시키는 방식
Next Sentence Prediction(NSP) : 두 문장이 이어지는 문장인지 아닌지 맞히도록 학습
자기지도 학습 : 학습 Label을 사람이 직접 만들지 않고 스스로 만든 데이터를 학습함으로써 언어의 기본 소양을 쌓음. 이처럼 스스로 정답이 있는 학습 데이터를 만들어 학습하는 방식을 자기지도학습(Self-supervised Learning)이라고 하고 이러한 방식으로 만들어진 언어 모델을 사전학습 모델(Pre-trained Language Model)이라고 한다.
전이학습(Transfer Learning) : 사전학습 모델을 기반으로 특정 태스크를 위해 한번 더 학습하는 방식을 전이학습이라고 하고, 이 학습 단계를 파인튜닝(Fine tuning)단계라고 한다. 파인튜닝이란 사전학습 모델을 기반으로 특정 태스크를 위해 딥러닝 모델을 미세하게 조정하는 학습 과정을 말한다.
태스크 활용 사례 : 사전학습 모델은 모델 자체로 특정 기능을 수행할 수 없다. 하지만 파인 튜닝을 통해 여러 다양한 태스크에 활용이 가능하다.
Case 1. 기계독해(MRC, Machine Reading Comprehension)
Case 2. 텍스트 분류(Text Classification)
Case 3. 문장 유사도 분석(STS, Semantic Textual Similarity)
Case 4. 문서 요약 모델(Text Summarization)
* RNN(Recurrent Neural Networks) 순환신경망 : 긴 문장의 의미를 파악하고 해당 문장이 의미하는 것이 무엇인지 예측하기 위한 방법으로 쉽게 말해 '여러개의 단어를 입력받게 되었을 때 앞에 입력받은 단어(토큰)을 잠시 기억하고 있다가 이 단어가 얼마나 중요하지 분석해 가중치를 담아 다음 단계로 넘기는 구조로 되어 있다.
* LSTM(Long Short Term Memory) 장단기 메모리 : RNN 기법의 하나로 기존 RNN의 문제인 기울기 소멸 문제(vanishing gradient problem)를 방지하기 위해 개발되었다.
1. 자연어 처리(Natural Language Processing, NLP) : 자연어 처리(NLP)는 인간이 대화하는 말의 형태를 기계가 배우는 머신러닝 방법을 말한다. 지금까지 기본적으로 NLP로 진행해 왔던 분류는 다음과 같다. - 텍스트 분류 및 순위(Text classification and ranking) : 스팸이나 정크 메일을 필터링 해서 분류하는 것이 대표적이다. - 감성 분석(Sentiment analysis) : 이 분석은 머신이 제공하는 피드백에 대한 감성적 반응을 예측한다. 고객 관계와 만족도가 팩터가 된다. - 문서 요약(Document summarization) : 복합적이고 복잡한 긴 글을 짧고 압축된 정의를 사용해 제시하는 방법이다. 궁극적인 목적은 이해하기 쉽게 만드는데 있다. - 개체 이름 인식(Named-Entity Recognition, NER) : 이것은 비구조화된 언어들 세트에서 구조화되고 인식가능한 데이터를 찾아내는 것이다. 이 머신러닝 프로세스는 대화 중 문맥에 맞게 적용하거나 가장 적합한 반응을 이끌어내는데, 가장 적합한 키워드를 알아내는 것을 배운다. - 음성 인식(Speech recognition) : 음성 인식은 아마존 알렉사, 구글 어시스턴트 등에서 쉽게 볼 수 있는 메커니즘이다. 이 메커니즘의 기본은 사람의 음성으로부터 오디오 신호를 인식하여 활자와 결합하는 것을 배우는 것이다. - 기계 번역(Machine translation) : 기록된 특정 나라 언어를 다른 나라의 언어로 변환하는 자동화된 시스템을 말한다.
반응형
2. 데이터셋(Dataset) : 머신러닝의 실행 가능성과 진행을 테스트하기 위해 사용할 수 있는 변수들의 집합이라고 할 수 있다. 데이터는 머신러닝을 진행하기 위한 필수 요소이다. - 트레이닝 데이터(Training data) : 이름에서 알 수 있듯이, 트레이닝 데이터는 추론을 통한 모델 학습을 통해 패턴을 예측하기 위해 사용된다. 트레이닝 데이터의 영향력이 매우 크기 때문에, 다른 요소에 비해 매우 중요한 요소라 할 수 있다. - 검증 데이터(Validation data) : 트레이닝된 모델의 하이퍼 파라미터를 미세 조정하는데 사용하는 데이터이다. 이를 통해 최종 완성된 모델이 만들어진다. - 테스트 데이터(Test data) : 모델 학습이 완성되었다고 생각되면, 테스트 데이터를 통해 완성된 모델이 실제 제대로 동작하는지 확인한다.
3. 컴퓨터 비전(Computer Vision, CV) : 이미지와 영상 데이터에 대한 고급 분석을 제공하는 툴이라고 할 수 있다. - 이미지 분류(Image classification) : 다양한 이미지와 그림 표현을 인식하고 학습하도록 한다. 이 모델은 색상 변경과 같은 작은 변화가 있는 동일한 이미지를 인식하여 동일한 이미지로 유지한다. - 객체 인식(Object detection) : 이미지 분류와 달리, 전체 뷰에서 객체 이미지를 인식하는데 사용되는 모델이다. 이 모델은 대용량 데이터 셋에 객체 식별을 적용할 수 있고, 패턴 인식이 가능하도록 해준다. - 이미지 분할(Image segmentation) : 이 모델은 과거에 처리한 픽셀과 특정 이미지 또는 영상 픽셀을 연결하는 것이다. - 특징 인식(Saliency detection) : 이미지 또는 영상 속에서 시각적으로 가장 중요한 물체가 어디에 있는지 얼마나 중요한지 찾아내기 위한 모델이다. * Object detection은 영상 속 존재하는 모든 물체들의 위치를 box형태로 찾아내고 각각의 종류를 분류하는 것이고, Object segmenatation은 영상을 같은 종류 물체끼리 분할하여 픽셀 단위로 표시하는 것이다. Saliency detection은 이미지 내에서 중요하다고 생각되는 물체를 검출해내는 방법과 사람의 시선이 어디에 가장 오래 머물지 예측하는 방법으로 나뉜다.
그래프에서 볼 수 있듯이, 사람들의 몸무게와 키 사이에는 양의 상관관계가 있다는 것을 알 수 있습니다.
위 그래프에서 점을 기반으로 직선을 그리고, 그 직선으로 키에 따른 다른 사람의 몸무게를 예측할 수 있습니다.
모델 피팅을 위한 LinearRegression 클래스 사용하기
그렇다면 모든 점들을 연결해서 중심축을 지나는 직선을 어떻게 그릴 수 있을까요? 이를 수행하기 위해 사이킷런(Scikit-learn) 라이브러리에는 LinearRegression 클래스가 있습니다. 우리가 해야 하는 일은 이 클래스의 인스턴스를 만들고, 몸무게와 키의 리스트를 사용해 fit() 함수로 다음과 같이 선형 회귀분석(linear regression) 모델을 생성하는 것입니다.
>>> from sklearn.linear_model import LinearRegression
>>> model = LinearRegression() # 모델을 생성합니다.
>>> model.fit(X=heights, y=weights) # 모델에 X, y 값들을 적용합니다. fit 함수는 리스트 또는 배열 형태의 X, y 인수들을 필요로 합니다.
반응형
예측 만들기
fit 함수로 모델을 훈련하고 나면, predict 함수를 사용해 다음과 같이 예측을 만들 수 있습니다.
>>> weight = model.predict([[1.75]])[0][0]
>>> round(weight, 2) # 예측 값은 76.04로 나옵니다.
위 예제에서, 훈련된 모델을 기반으로 키가 1.75m인 사람의 몸무게는 76.04kg으로 예측되었습니다.
선형 회귀분석 선 그리기
LinearRegression 클래스에 의해 생성된 선형 회귀분석 선을 시각화하는 것이 유용할 것입니다. 먼저 원래의 데이터 포인트를 플로팅한 다음 모델에 키 목록을 보내 가중치를 예측합니다. 그런 다음 일련의 예상 가중치를 플롯하여 선을 얻습니다. 다음 스니펫 코드는 수행되는 방식을 보여줍니다.
>>> import matplotlib.pyplot as plt
>>> plt.rc('font', family='NanumGothic') # 한글을 표시하기 위해, 한글 폰트를 설정합니다. 여기서는 네이버 글꼴로 처리했습니다. 무료로 지원되는 네이버 글꼴을 미리 다운로드 받아야 합니다. 다른 글꼴을 사용하시려면 글꼴명을 변경해서 사용하시면 됩니다.
>>> plt.plot(heights, model.predict(heights), color='r') # 선형 회귀 선을 그립니다.
선형 회귀분석 선의 기울기 및 절편 얻기
위 그래프에서는 선형 회귀분석 선의 y 축 절편이 무엇인지 명확하지 않습니다. 이는 1.5로 플로팅을 시작하도록 x축을 조정했기 때문입니다. 이를 시각화하는 더 좋은 방법은 x 축을 0에서 시작하고 y 축의 범위를 확대하여 설정하는 것입니다. 그런 다음 높이 0과 1.8의 두 가지 극단 값을 입력하여 선을 그립니다. 다음 스니펫 코드는 점과 선형 회귀분석 선을 다시 그립니다.
>>> plt.title('키 대비 몸무게 그래프')
>>> plt.xlabel('키(미터)')
>>> plt.ylabel('몸무게(킬로그램)')
>>> plt.plot(heights, weights, 'k.')
>>> plt.axis([0, 1.85, -200, 200])
>>> plt.grid(True)
>>> extreme_heights = [[0], [1.8]]
>>> plt.plot(extreme_heights, model.predict(extreme_heights), color='b') # 선형 회귀분석 선을 그립니다.
>>> round(model.predict([[0]])[0][0], 2) # 키가 0 인 경우 몸무게를 예측하여 y 절편(-104.75)을 얻을 수 있습니다.
>>> round(model.intercept_[0], 2) # intercept_ 속성을 통해 직접 답변(-104.75)을 받을 수 있습니다.
>>> round(model.coef_[0] [0], 2) # coef_ 속성을 통해 선형 회귀 선의 그래디언트(103.31)을 얻을 수도 있습니다.
RSS를 계산하여 모델의 성능 검토하기
선형 회귀분석 선이 모든 데이터 요소가 잘 맞는지 알아 보려면, RSS(Residual Sum of Squares) 메서드를 사용합니다.
먼저 이와 관련된 용어들에 대해 알아보도록 하겠습니다.
R-squared(R^2)는 우리말로 결정계수라고 합니다.
R-squared는 0부터 1 사이의 값을 가지고, 1에 가까울수록 설명력이 높은 것을 의미합니다(선형 회귀분석 모델이 얼마나 데이터를 잘 설명해 주는지에 대한 값입니다)
Scikit-learn 라이브러리는 파이썬에서 가장 유명한 머신러닝 라이브러리 중 하나로, 분류(classification), 회귀(regression), 군집화(clustering), 의사결정 트리(decision tree) 등의 다양한 머신러닝 알고리즘을 적용할 수 있는 함수들을 제공합니다.
이번에는 머신러닝 수행 방법을 알아보기 전에, 다양한 샘플 데이터를 확보할 수 있는 방법들을 알아보려고 합니다.
데이터셋(Datasets) 얻기
머신러닝을 시작할 때, 간단하게 데이터셋을 얻어서 알고리즘을 테스트해 보는 것이 머신러닝을 이해하는데 있어 매우 유용합니다. 간단한 데이터셋으로 원리를 이해한 후, 실제 생활에서 얻을 수 있는 더 큰 데이터셋을 가지고 작업하는 것이 좋습니다.
우선 머신러닝을 연습하기 위해, 간단한 데이터셋을 얻을 수 있는 곳은 다음과 같습니다. 하나씩 차례대로 알아보도록 하겠습니다.
사이킷런의 빌트인 데이터셋
캐글(Kaggle) 데이터셋
UCI(캘리포니아 대학, 얼바인) 머신러닝 저장소
<사이킷런 데이터셋 사용하기>
사이킷런에는 머신러닝을 쉽게 배울 수 있도록 하기 위해, 샘플 데이터셋을 가지고 있습니다.
샘플 데이터셋을 로드하기 위해, 데이터셋 모듈을 읽어들입니다. 다음은 Iris 데이터셋을 로드한 코드입니다.
>>> from sklearn import datasets
>>> iris = datasets.load_iris() # 아이리스 꽃 데이터셋 또는 피셔 아이리스 데이터셋은 영국의 통계 학자이자 생물학자인 로널드 피셔 (Ronald Fisher)가 소개한 다변수 데이터셋입니다. 데이터셋은 3종의 아이리스(Iris)로 된 50개 샘플로 구성되어 있습니다. 각 샘플로부터 4개의 피쳐(features:피쳐를 우리말로 변수 또는 요인이라고 표현하기도 함)를 측정할 수 있습니다: 꽃받침과 꽃잎의 길이와 너비입니다. 이러한 4가지 피쳐(features)의 결합을 바탕으로 피셔는 종을 서로 구분할 수 있는 선형 판별 모델을 개발했습니다.
로드된 데이터셋은 속성-스타일 접근을 제공하는 파이썬 딕셔너리, 번치(bunch) 객체로 표현됩니다.
>>> print(iris.DESCR) # DESCR 속성을 사용해 데이터셋의 정보를 다음과 같이 얻을 수 있습니다.
>>> print(iris.data) # data 속성을 사용해 피쳐를 알아볼 수 있습니다.
>>> print(iris.feature_names) # feature_names 속성으로 피쳐 이름을 알아낼 수 있습니다.
이것은 데이터셋이 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비 등 4개의 컬럼들로 구성되어 있다는 것을 의미합니다.
>>> print(iris.target) # 레이블을 알 수 있습니다.
>>> print(iris.target_names) # 레이블 이름을 알 수 있습니다.
여기서 0은 'setosa'를, 1은 'versicolor'를 2는 'virginica'를 나타냅니다.
(사이킷런의 모든 샘플 데이터가 feature_names, target_names 속성을 지원하는 것은 아닙니다)
여기서, 데이터를 쉽게 다루기 위해, 판다스(Pandas)의 데이터프레임으로 변환하는 것이 유용합니다.
>>> import pandas as pd # pandas 라이브러리를 읽어들입니다.
>>> df = pd.DataFrame(iris.data)
>>> df.head()
<캐글(Kaggle) 데이터셋 사용하기>
데이터 과학자 및 머신러닝 학습자들에게 있어,캐글(Kaggle)은 세계에서 가장 큰 커뮤니티입니다.
머신러닝 경쟁을 제공하는 플랫폼에서 시작하여, 현재 캐글(Kaggle)은 공개 데이터 플랫폼과 데이터 과학자를 위한 클라우드 기반 워크 벤치도 제공합니다.
구글이 2017년 3월에 캐글(Kaggle)을 인수했습니다.
우리는 머신러닝 학습자들을 위해, 캐글(Kaggle)에서 제공된 샘플 데이터셋을 이용할 수 있습니다.