지난 포스트에 이어 이번 포스트는 머신러닝에 대해 다룹니다.
모든 알고리즘에 대해서 다룰 수는 없었지만 처음으로 머신러닝을 접할 수 있었다는 점에서 의미가 있었습니다.
머신러닝 알고리즘을 이용해 취약점 분석 도구를 만들기 위해 사용할 알고리즘을 선택하기 위해 조사했습니다.
가장 기초적인 머신러닝 모델로 여러가지 데이터를 활용해 연속형 변수인 목표 변수를 예측해 내는 것이 목적이다.
ex. 몸무게, 나이, BMI, 성별 등을 데이터로 활용해 키와 같은 연속형 변수를 예측
반면, 남성-여성으로 구분되는 성별은 연속형 변수 X
선형 회귀 모델에서는 예측할 종속변수만 연속형 변수면 ok
Yes/No 처럼 두 가지로 나뉘는 이진 분류 문제를 다룸
거리 기반 모델
: 각 데이터 간의 거리를 활용해 새로운 데이터를 예측하는 모델
: 이때 가까이에 있는 데이터를 고려해 예측값 결정
: K개의 가장 가까운 이웃 데이터에 의해 예측된다는 의미
베이즈 정리를 적용한 조건부 확률 기반의 분류 모델
스팸 메일 필터처럼 자연어 처리가 목적일 때는 나이브 베이즈 모델이 좋은 선택이 될 수 있음 (딥러닝이 자연어 처리에 더 탁월한 모습을 보여주지만, 딥러닝보다 간단한 방법으로 자연어 처리를 원할 때)
결정 트리의 단점인 오버피팅 문제를 완화시켜주는 발전된 형태의 트리 모델
랜덤으로 생성된 무수히 많은 트리 이용해 예측
중간평가 때 작성했던 내 후기
이 프로젝트를 진행하면서 프로그래밍 언어에 대한 기초 실력만 가지고 있었던 저는 앞으로의 진로에 대해 좀 더 생각할 수 있는 시간을 가지게 되었고, 그동안 알지 못했던 다양한 프로그램과 도구 사용법, AI와 시큐어 코딩에 관련된 다양한 지식을 팀원들과 멘토님으로부터 배우고 있습니다. 또한 이 프로젝트는 AI 기반의 시큐어 코딩 점검 도구에 대해서만 공부하는 것이 아니라, 커뮤니케이션을 통해 프로젝트 진행 방법과 앞으로의 방향성을 소통하는 방법을 배울 수 있는 기회를 제공해 주어서 참여한 것에 대해 뿌듯함을 느끼고 있습니다.
프로젝트하며 참고했던 논문의 일부들
code2vec 모델을 활용한 소스 코드 보안 취약점 탐지 (1).pdf
code2vec을 이용한 유사도 감정 도구의 성능 개선.pdf
소스코드 취약성 분류를 위한 기계학습 기법의 적용.pdf
Microsoft Malware Classification Challenge (BIG 2015)
GitHub - xiaozhouwang/kaggle_Microsoft_Malware: code for kaggle competition Microsoft malware classification
머신러닝 알고리즘 조사 후 Juliet Code에서 가져온 Java 파일들을 주석 제거 -> text 파일로 추출 -> 메소드 별로 구분(good, bad)-> code token화 -> token을 vector화로 시키는 작업을 진행했다.
파이썬 기반의 머신러닝 라이브러리로 다양한 머신러닝 알고리즘과 도구를 제공함.
| 단계 | 설명 | 코드 예시 | 비고 |
|---|---|---|---|
| 데이터 로딩 | 데이터셋 로드 | load_iris() | 붓꽃 데이터셋 로드 |
| 데이터 전처리 | 데이터를 표준화 | StandardScaler() | 데이터를 평균과 표준편차를 기반으로 표준화하는 데 사용됨 |
| 모델 선택 및 초기화 | 선형 회귀 모델 생성 | LinearRegression() | 선형 회귀 모델 생성 |
| 학습 | 학습 데이터 전달 | model.fit(X_train, y_train) | 학습 데이터 X_train과 해당 데이터의 레이블 y_train을 사용하여 모델을 학습시킴 |
| 예측 | 새로운 데이터에 대한 예측 수행 | y_pred = model.predict(X_test) | 테스트 데이터 X_test에 대한 예측값을 반환 |
| 모델 평가 | 모델 정확도 계산 | accuracy_score(y_true, y_pred) | 예측값 y_pred와 실제값 y_true 간의 정확도를 계산 |
| 하이퍼파라미터 튜닝 | 모델의 성능 향상 | GridSearchCV 또는 RandomizedSearchCV | 모델의 성능을 향상시키기 위해 하이퍼파라미터를 조정 |
ex )
1. dataset load
2. data를 특징 data와 레이블 data로 나눈 후 train_test_split() 함수 사용해→ 학습용/테스트용으로 분할
3. KNeighborsClassifier() 를 사용해 K-최근접 이웃 분류기 모델 생성
4. fit() 사용해 모델 학습
텍스트 전처리 (Text Preprocessing) : 컴퓨터가 인간의 언어를 처리하는 분야인 자연어 처리(NLP : Natural Language Processing)에서 컴퓨터가 풀고자 하는 문제의 용도에 맞게 텍스트를 사전에 처리하는 작업
종류
a. 토큰화(Tokenizing)
b. 정제(Cleaning)
c. 정규화(Normalizing)
d. 어간추출(Stemming)
e. 표제어추출(Lemmatization)
f. 불용어(Stopwords)
g. 정수인코딩(Integer Encoding)
h. 패딩(Padding)
i. One-Hot Encoding
토큰화(Tokenization)
주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업을 토큰화라고 함, 토큰의 단위가 상황에 따라 다르지만 보통 의미있는 단위로 정의
3.2. 한글 토큰화의 종류
단순 띄어쓰기 단위로 토큰화를 하면 한글 특성상 분리가 잘 안됨→ 형태소(morpheme)단위로 수행함
형태소 단위 토큰화 다음으로 많이 쓰는 방식
: word piece 혹은 subword segmentation(서브워드 분리) 방식
하나의 단어는 더 작은 단위의 의미있는 여러 서브워드들로 구성되는 경우가 많기 때문에 하나의 단어를 더 작은 여러 서브워드로 분리하는 방식
⇒ 형태소 분석 방식
⇒ subword tokenizer 방식
형태소 분석 방식
각 단어가 어떤 품사로 쓰였는지를 구분해놓기도 하는데 이 작업을 품사 태깅(part-of-speech tagging)
Subword Tokenizer
하나의 단어는 더 작은 단위의 의미있는 여러 서브워드들(ex. birthplace = birth + place)의 조합으로 구성된 경우가 많기 때문에 하나의 단어를 여러 서브워드로 분리해서 단어를 인코딩 및 임베딩하겠다는 의도를 가진 전처리 작업
이를 통해 OOV(Out-Of-Vocabulary)나 희귀 단어, 신조어와 같은 문제를 완화시킬 수 있음
Subword Tokenizer 알고리즘 중 대표적인 것이 Byte Pair Encoding(BPE)이고 BPE를 포함한 다양한 Subword Tokenizer 알고리즘을 포함한 패키지 도구가 SentencePiece (구글 개발)
5.1. Byte Pair Encoding (BPE)
정보 압축 알고리즘으로 데이터에서 가장 많이 등장한 문자열을 병합해서 데이터를 압축하는 기법
데이터에 등장한 글자를 초기 사전으로 구성, 연속된 두 글자를 한 글자로 병합함
사전 크기를 지나치게 늘리지 않으며 각 데이터 길이를 효율적으로 압축할 수 있음
BPE 이전에는 원래 데이터를 표현하기 위한 사전 크기가 4개(a, b, c, d)였지만 수행 이후 7개(a, b, c, d, Z, Y, X)로 늘었음
BPE를 활용한 토크나이즈 절차는
1) 어휘 집합 구축 : 자주 등장하는 문자열을 병합하고 이를 어휘 집합에 추가, 이를 원하는 어휘 집합 크기가 될 때까지 반복
어휘 집합을 만드려면 말뭉치가 필요, 말뭉치의 모든 문장을 공백으로 나눔→ pre-tokenize라고 하는데 본격적인 토큰화에 앞서 미리 분석했다는 의미, 공백 말고 다른 기준으로도 pre-tokenize 수행 가능
2) 토큰화 : 토큰화 대상 문장 내 각 어절에서 어휘 집합에 있는 서브워드가 포함되어 있을 때 해당 서브워드를 어절에서 분리
어휘 집합(vocab.json)과 병합 우선순위(merge.txt)가 있으면 토큰화를 수행할 수 있음
SentencePiece : BPE 알고리즘과 Unigram LAnguage Model Tokenizer를 구현, 내부 단어 분리를 위한 유용한 패키지, 사전 토큰화 작업없이 단어 분리 토큰화를 수행하므로 특정 언어에 종속되지 않음
한글 토큰화 실습
6.1. 형태소(morpheme) 분석 실습
한국어 자연어 처리를 위해 KoNLPy라는 파이썬 패키지 사용, KoNLPy를 통해 사용할 수 있는 형태소 분석기로 Okt(Open Korea Text), Mecab, Komoran, Hannanum, Kkma 가 있음 →주로 Okt 사용, Mecab은 처리 속도 빨라서 많이 사용됨
Okt의 기능
1) morphs : 형태소 추출
2) pos : 품사 태깅(Part-of-speech tagging)
3) nouns : 명사 추출
여기까지 노션에 정리했던 부분을 옮겨보았고, 실제 코드를 사용하여 적용한 부분은 다음 포스팅에서 계속 적어보겠습니다!
노션으로 기록용으로 대강 적어놓았더니 뒤죽박죽이라 다음 포스팅 전에 노션 정비 후에 마저 써보겠습니다 !