A Study on Tools for Development of AI-based Secure Coding Inspection (3)

·2024년 8월 18일

지난 포스트에 이어 이번 포스트는 머신러닝에 대해 다룹니다.
모든 알고리즘에 대해서 다룰 수는 없었지만 처음으로 머신러닝을 접할 수 있었다는 점에서 의미가 있었습니다.

머신러닝 알고리즘을 이용해 취약점 분석 도구를 만들기 위해 사용할 알고리즘을 선택하기 위해 조사했습니다.


머신러닝 알고리즘

1. 선형 회귀(Linear Regression)

가장 기초적인 머신러닝 모델로 여러가지 데이터를 활용해 연속형 변수인 목표 변수를 예측해 내는 것이 목적이다.
ex. 몸무게, 나이, BMI, 성별 등을 데이터로 활용해 키와 같은 연속형 변수를 예측
반면, 남성-여성으로 구분되는 성별은 연속형 변수 X
선형 회귀 모델에서는 예측할 종속변수만 연속형 변수면 ok

  • 구분 : 지도 학습
  • 문제 유형 : 회귀
  • 적합한 데이터 유형 : 종속변수와 독립변수가 선형 관계에 있는 데이터
  • 장점
    • 데이터 특성이 복잡하지 않을 때는 쉽고 빠른 예측 가능
    • 다른 모델과의 성능을 비교하는 베이스라인으로 사용하기도 함
    • 모델이 간단해 구현과 해석 쉬움
    • 모델링하는데 오랜 시간 걸리지 않음
  • 단점
    • 복잡한(최신) 알고리즘에 비해 예측력 떨어짐
    • 독립변수와 예측변수의 선형 관계를 전제로 하기 때문에 이러한 전제를 벗어나는 데이터에서는 좋은 예측을 보여주기 어려움

2. 로지스틱 회귀(Logistic regression)

Yes/No 처럼 두 가지로 나뉘는 이진 분류 문제를 다룸

  • 구분 : 지도 학습
  • 문제 유형 : 분류
  • 적합한 데이터 유형 : 종속변수와 독립변수가 선형 관계에 있는 데이터
  • 장점
    • 두 가지 범주를 구분하는 간단한 예측에 유용
    • 딥러닝에서도 기본 지식
    • 선형 회귀 분석만큼 구현하기 용이
    • 계수(기울기)를 사용해 변수의 중요성 쉽게 파악 가능
  • 단점
    • 선현 회귀 분석을 근간으로 하고 있기 때문에 선형 관계 아닌 데이터에 대한 예측력이 떨어짐
    • 분류 문제에 있어서 기준선으로 자주 활용됨(타 모델과 비교 목적)

3. K- 최근접 이웃(K Nearest Neighbors)

거리 기반 모델
: 각 데이터 간의 거리를 활용해 새로운 데이터를 예측하는 모델
: 이때 가까이에 있는 데이터를 고려해 예측값 결정
: K개의 가장 가까운 이웃 데이터에 의해 예측된다는 의미

  • 구분 : 지도 학습
  • 문제 유형 : 회귀/분류
  • 적합한 데이터 유형 : 아웃라이어가 적은 데이터
  • 장점
    • 다중분류 문제에 가장 간편히 적용 가능
    • 데이터가 크지 않고 예측이 까다롭지 않은 상황에서 사용하면 신속하고 쉽게 예측 모델 구현 가능 → 베이스라인 모델로도 사용
    • 수식에 대한 설명이 필요 없을 만큼 직관적이고 간단함
    • 선형 모델과 다르게 별도의 가정이 없음
  • 단점
    • 데이터가 커질수록 느려짐
    • 아웃라이어에 취약
  • 주로 분류(Classification)에서 사용되며 로지스틱 회귀로 해결할 수 없는 3개 이상의 목표 변수들도 분류 가능

4. 나이브 베이즈(Naive Bayes)

베이즈 정리를 적용한 조건부 확률 기반의 분류 모델

스팸 메일 필터처럼 자연어 처리가 목적일 때는 나이브 베이즈 모델이 좋은 선택이 될 수 있음 (딥러닝이 자연어 처리에 더 탁월한 모습을 보여주지만, 딥러닝보다 간단한 방법으로 자연어 처리를 원할 때)

  • 구분 : 지도 학습
  • 문제 유형 : 분류
  • 적합한 데이터 유형 : 독립변수의 종류가 매우 많은 경우
  • 장점
    • 독립변수들이 모두 독립적이라면 충분히 경쟁력 있는 알고리즘
    • 딥러닝 제외하고 자연어 처리에 가장 적합한 알고리즘
    • 비교적 간단한 알고리즘이며 속도 또한 빠름
    • 작은 훈련셋으로도 잘 예측
  • 단점
    • 실제로 독립변수들이 모두 독립적이라면 다른 알고리즘보다 우수할 수 있지만, 실제 데이터에서 그런 경우가 많지 않기 때문에 단점이기도 함
  • 각 독립변수들이 모두 독립적이고 그 중요도가 비슷할 때 유용
  • 자연어 처리(NLP)에서 간단하지만 좋은 성능을 보여줌
  • 범주 형태의 변수가 많을 때 적합하며, 숫자형 변수가 많은 때는 적합하지 않음

5. 결정 트리(Decision Tree)

  • 관측값과 목푯값을 연결시켜주는 예측 모델로서 나무 모양으로 데이터를 분류
  • 수많은 트리 기반 모델의 기본 모델이 되는 중요 모델
    트리 기반의 모델

6. 랜덤 포레스트(Random Forest)

결정 트리의 단점인 오버피팅 문제를 완화시켜주는 발전된 형태의 트리 모델

랜덤으로 생성된 무수히 많은 트리 이용해 예측

  • 구분 : 지도 학습
  • 문제 유형 : 회귀/분류
  • 적합한 데이터 유형 : 일반적인 데이터
  • 장점
    • 다음 단계인 부스팅 모델을 이해하려면 꼭 알아야 하는 필수 알고리즘
    • 결정트리와 마찬가지로 아웃라이어에게 거의 영향을 받지 않음
    • 선형/비선형 데이터에 상관없이 잘 작동함
  • 단점
    • 예측력이나 속도에서 부족
    • 시각화 부족
    • 학습 속도가 상대적으로 느린 편
    • 수많은 트리를 동원하기 때문에 모델에 대한 해석이 어려움

7. XG부스트(XGBoost)

  • 각 트리를 독립적으로 만드는 알고리즘
  • 부스팅은 순차적으로 트리를 만들어 이전 트리로부터 더 나은 트리를 만들어내는 알고리즘
  • 랜덤 포레스트보다 훨씬 빠른 속도와 더 좋은 예측 능력을 보여줌
  • 손실함수뿐만 아니라 모형 복잡도까지 고려함

중간평가 때 작성했던 내 후기

이 프로젝트를 진행하면서 프로그래밍 언어에 대한 기초 실력만 가지고 있었던 저는 앞으로의 진로에 대해 좀 더 생각할 수 있는 시간을 가지게 되었고, 그동안 알지 못했던 다양한 프로그램과 도구 사용법, 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화로 시키는 작업을 진행했다.

Scikit-learn 분석 및 적용

파이썬 기반의 머신러닝 라이브러리로 다양한 머신러닝 알고리즘과 도구를 제공함.

문법

단계설명코드 예시비고
데이터 로딩데이터셋 로드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() 사용해 모델 학습

텍스트 전처리 및 벡터화

텍스트 전처리

  1. 텍스트 전처리 (Text Preprocessing) : 컴퓨터가 인간의 언어를 처리하는 분야인 자연어 처리(NLP : Natural Language Processing)에서 컴퓨터가 풀고자 하는 문제의 용도에 맞게 텍스트를 사전에 처리하는 작업

  2. 종류
    a. 토큰화(Tokenizing)
    b. 정제(Cleaning)
    c. 정규화(Normalizing)
    d. 어간추출(Stemming)
    e. 표제어추출(Lemmatization)
    f. 불용어(Stopwords)
    g. 정수인코딩(Integer Encoding)
    h. 패딩(Padding)
    i. One-Hot Encoding

  3. 토큰화(Tokenization)
    주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업을 토큰화라고 함, 토큰의 단위가 상황에 따라 다르지만 보통 의미있는 단위로 정의

    3.2. 한글 토큰화의 종류
    단순 띄어쓰기 단위로 토큰화를 하면 한글 특성상 분리가 잘 안됨→ 형태소(morpheme)단위로 수행함
    형태소 단위 토큰화 다음으로 많이 쓰는 방식
    : word piece 혹은 subword segmentation(서브워드 분리) 방식

  • 하나의 단어는 더 작은 단위의 의미있는 여러 서브워드들로 구성되는 경우가 많기 때문에 하나의 단어를 더 작은 여러 서브워드로 분리하는 방식

    형태소 분석 방식
    subword tokenizer 방식

  1. 형태소 분석 방식
    각 단어가 어떤 품사로 쓰였는지를 구분해놓기도 하는데 이 작업을 품사 태깅(part-of-speech tagging)

  2. 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를 구현, 내부 단어 분리를 위한 유용한 패키지, 사전 토큰화 작업없이 단어 분리 토큰화를 수행하므로 특정 언어에 종속되지 않음

  3. 한글 토큰화 실습
    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 : 명사 추출


여기까지 노션에 정리했던 부분을 옮겨보았고, 실제 코드를 사용하여 적용한 부분은 다음 포스팅에서 계속 적어보겠습니다!
노션으로 기록용으로 대강 적어놓았더니 뒤죽박죽이라 다음 포스팅 전에 노션 정비 후에 마저 써보겠습니다 !

profile
Whatever I want | Interested in DFIR, Security, Infra, Cloud

0개의 댓글