<가설 정의>

1. MNIST 데이터를 불러와 학습하기 적합한 형태로 변형

# -*- coding: utf-8 -*-

import tensorflow as tf

# MNIST 데이터를 다운로드 
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

load_data() 호출 시 MNIST 데이터를 numpy (int)array 형태로 반환해줌

x_train, y_train에는 약 60000개의 트레이닝 데이터, x_test, y_test에는 약 10000개의 테스트 데이터가 있음

 

 

# 이미지들을 float32 데이터 타입으로 변경
x_train, x_test = x_train.astype('float32'), x_test.astype('float32')
# 28*28 형태의 이미지를 784차원으로 flattening 함
x_train, x_test = x_train.reshape([-1, 784]), x_test.reshape([-1, 784])
# [0, 255] 사이의 값을 [0, 1]사이의 값으로 Normalize 함
x_train, x_test = x_train / 255., x_test / 255.

astype : 데이터 형변환

reshape(-1,~) : 여기서 -1은 매직넘버. 앞 차원에 알아서 맞춰줌. 기본 옵션이라고 생각

flattening : 2차원 데이터를 한 픽셀씩 펼쳐서 1차원 데이터로 변경하는 것. 28*28 -> 784

 

MNIST 데이터는 픽셀 하나당 0-255까지의 숫자값을 가지므로 ,이를 255로 나누면 0-1 사이로 normalize 됨

 

# 레이블 데이터에 one-hot encoding을 적용
y_train, y_test = tf.one_hot(y_train, depth=10), tf.one_hot(y_test, depth=10)

정답 데이터가 int 형이므로 one-hot encoding 을 적용해준다.

( 1 → 1000000000, 2 → 0100000000, 3 → 0010000000 이런 형식) 

 


2. 전체 데이터를 원하는 mini-batch 개수만큼 묶어줌

# tf.data API를 이용해서 데이터를 섞고 batch 형태로 가져옴
train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_data = train_data.repeat().shuffle(60000).batch(100)
train_data_iter = iter(train_data)

tf.data.Dataset : api. 미니배치 단위로 묶는 과정을 손쉽게 할 수 있도록 함

iter : iterator. 100개씩의 미니배치를 순차적으로 가리키게 됨

 


3. 소프트맥스 회귀 모델 정의

# tf.keras.Model을 이용해서 Softmax Regression 모델을 정의
class SoftmaxRegression(tf.keras.Model):
  def __init__(self):
    super(SoftmaxRegression, self).__init__()
    self.softmax_layer = tf.keras.layers.Dense(10,
                                               activation=None,
                                               kernel_initializer='zeros',
                                               bias_initializer='zeros')

  def call(self, x):
    logits = self.softmax_layer(x)

    return tf.nn.softmax(logits)

tf.keras.Model : 상속받는 클래스

tf.keras.layers.Dense : Wx+b를 추상화 해놓은 api (input을 넣었을 때 output으로 바꿔주는 중간 다리)

→ 10 = units. 출력 값의 크기, activation = 활성화 함수, kernel_initializer = 가중치(W) 초기화 함수, bias_initializer = 편향(b) 초기화 함수

 

call : 클래스 호출 시 동작하는 함수

logits : softmax(Wx+b)가 적용된 10 dimension의 값이 담겨있음

 


<손실함수 정의>

# cross-entropy 손실 함수를 정의
@tf.function
def cross_entropy_loss(y_pred, y):
  return tf.reduce_mean(-tf.reduce_sum(y * tf.math.log(y_pred), axis=[1]))
  #return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logtis, labels=y)) # tf.nn.softmax_cross_entropy_with_logits API를 이용한 구현

<최적화>

# 최적화를 위한 그라디언트 디센트 옵티마이저를 정의
optimizer = tf.optimizers.SGD(0.5)

# 최적화를 위한 function을 정의
@tf.function
def train_step(model, x, y):
  with tf.GradientTape() as tape:
    y_pred = model(x)
    loss = cross_entropy_loss(y_pred, y)
  gradients = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

SGD : 옵티마이저 종류 중 하나

0.5 : learning rate

 

 

# 모델의 정확도를 출력하는 함수를 정의
@tf.function
def compute_accuracy(y_pred, y):  #모델이 예측한 값, 정답값
  correct_prediction = tf.equal(tf.argmax(y_pred,1), tf.argmax(y,1))  #일치 개수 반환
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  #0~1 사이의 정확도 반환

  return accuracy

argmax :  최대값을 갖는 성분의 인덱스를 반환

y_pred는 softmax 함수 결과 값이 들어있다. [0.01, 0.4, 0.7, 0.04, 0.2, 0.082, 0.03, 0.002, 0.3, 0.06] 

하지만 정답값 y에는 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] 과 같은 형식으로 들어있다.

따라서 y_pred에 argmax 함수를 취하여 최대값을 갖는 성분의 인덱스를 반환하여 비교시키는 작업이 필요하다

 

 

# SoftmaxRegression 모델을 선언
SoftmaxRegression_model = SoftmaxRegression()

# 1000번 반복을 수행하면서 파라미터 최적화를 수행
for i in range(1000):
  batch_xs, batch_ys = next(train_data_iter)  #100개씩의 mini-batch 데이터가 반환
  train_step(SoftmaxRegression_model, batch_xs, batch_ys)

# 학습이 끝나면 학습된 모델의 정확도를 출력
print("정확도(Accuracy): %f" % compute_accuracy(SoftmaxRegression_model(x_test), y_test)) # 정확도 : 약 91%

batch_xs : (100, 784) MNIST 데이터

batch_ys : 100 dimension의 원-핫 인코딩된 데이터

 

 

 

결과

 

 

# -*- coding: utf-8 -*-

import tensorflow as tf

# 선형회귀 모델(Wx + b)을 위한 tf.Variable을 선언
W = tf.Variable(tf.random.normal(shape=[1]))
b = tf.Variable(tf.random.normal(shape=[1]))

@tf.function
def linear_model(x):
  return W*x + b

# 손실 함수를 정의
# MSE 손실함수 \mean{(y' - y)^2}
@tf.function
def mse_loss(y_pred, y):
  return tf.reduce_mean(tf.square(y_pred - y))

# 최적화를 위한 그라디언트 디센트 옵티마이저를 정의
optimizer = tf.optimizers.SGD(0.01)

# 최적화를 위한 function을 정의
@tf.function
def train_step(x, y):
  with tf.GradientTape() as tape:
    y_pred = linear_model(x)
    loss = mse_loss(y_pred, y)
  gradients = tape.gradient(loss, [W, b])
  optimizer.apply_gradients(zip(gradients, [W, b]))

# 트레이닝을 위한 입력값과 출력값을 준비
x_train = [1, 2, 3, 4]
y_train = [2, 4, 6, 8]

# 경사하강법을 1000번 수행
for i in range(1000):
  train_step(x_train, y_train)

# 테스트를 위한 입력값을 준비
x_test = [3.5, 5, 5.5, 6]
# 테스트 데이터를 이용해 학습된 선형회귀 모델이 데이터의 경향성(y=2x)을 잘 학습했는지 측정
# 예상되는 참값 : [7, 10, 11, 12]
print(linear_model(x_test).numpy())

 

1-8 = 가설 정의

파라미터 W,b 정의

tf.Variable = api

random.normal = 가우시안 distribution에서 random 값을 뽑음

shape 인자 값 = 지정하고자 하는 모델의 파라미터 shape. 선형 회귀에선 하나의 데이터(x)를 받아 하나를 도출해내는 것이기 때문에 1차원으로 지정함

 

9-11 =Linear Regression 함수 작성

-----------------------------------------------------------------------------------------------

13 - 17 = 손실함수 정의

loss(예측값, 정답값)

square = 제곱함수

reduce_mean = 평균함수

 

-----------------------------------------------------------------------------------------------

19 - 29 = optimization 정의, gradient descent 정의

SGD : mini-batch gradient descent 실행해 주는 기본적인 옵티마이저

0.01 = learning rate

 

train_step : gradient descent를 한 단계 실행해주는 함수

y_pred : linear regression에 기반한 예측값

mse : mean_sqaured_error

gradients : loss에 대한 해당 파라미터(W,b)에 대한 gradient 값

zip : 계산한 gradient와 갱신 대상 파라미터(W,b)를 묶어줌 (   zip([1,2,3],[4,5,6]) ==> (1,4), (2,5), (3,6)   )

 

 

딥러닝 알고리즘의 "학습" = apply_gradient 함수를 반복 호출해 랜덤 파라미터를 학습 방향성에 맞게 변형 시켜주는 것!

 

실행 결과

 

 

'Study > Deep Learning' 카테고리의 다른 글

다층 퍼셉트론 MLP  (0) 2021.10.15
TensorFlow 2.0과 Softmax Regression을 이용한 MNIST 숫자분류기 구현  (0) 2021.10.15
TensorFlow  (0) 2021.10.15
다양한 Computer Vision 문제 영역  (0) 2021.10.14
머신러닝 Data 종류  (0) 2021.10.14

:: 구글에서 개발하여 공개한 딥러닝/머신러닝을 위한 오픈소스 라이브러리

:: 오픈소스

:: C++, JAVA, GO, python 등의 언어 지원

 

 

장점

1. 손쉬운 딥러닝 모델 구현 by Python API

2. Mobile Device부터 멀티 GPU 클러스터까지 지원하는 폭넓은 Portability

3. 강력한 시각화를 지원하는 TensorBoard 제공

4. 전세계적으로 폭넓은 사용자 Community

5. Google의 강력한 지원과 발빠른 신기능 업데이트

 

 

 

+) Tensor = "n차원 행렬"

0-d tensor : scalar

1-d tensor : vector

2-d tensor : matrix

 

 

 

1. Image Classification

인풋 이미지가 어떤 라벨(label)에 대응되는지 인풋 이미지에 대한 분류를 수행하는 문제 영역

ex) 이 이미지는 강아지고 이 이미지는 고양이다

출처 https://becominghuman.ai/cifar-10-image-classification-fd2ace47c5e8

 

2. Face Detection

얼굴이 있는 영역의 위치정보를 Bounding Box로 찾는 문제 영역 (x,y 좌표로 찾아줌)

위치 정보만 딱 알려줌

출처 https://www.technologyreview.com/2015/02/16/169357/the-face-detection-algorithm-set-to-revolutionize-image-search/

 

3. Face Alignment

얼굴의 특징 영역(눈,코,입) 을 포인트(Landmark)로 찾는 문제 영역

face detection보다 디테일함. 눈썹, 광대, 표정 등 디테일한 정보를 식별할 수 있음

출처 https://rapidapi.com/blog/top-facial-recognition-apis/

 

4. Steering Angle Prediction

자동차의 적합한 Steering Angle 조작값을 예측하는 문제 영역 (핸들링에 대한 조작값을 예측)

출처 https://paperswithcode.com/task/self-driving-cars/codeless?page=4

 

5. Super Resolution

저해상도 이미지를 인풋으로 받으면 이를 고해상도 이미지로 변경해주는 문제영역

출처 https://smilegate.ai/2020/10/19/ygs-super-resolution/

 

6. Object Detection

물체가 있는 영역의 위치정보를 Bounding Box로 찾고 Bounding Box 내에 존재하는 사물의 라벨(Label)을 분류하는 문제영역 

ex) 이 Box 안에 있는 물체는 사람/자동차/고양이 이다. 까지 분류 가능

출처 https://hoya012.github.io/blog/Tutorials-of-Object-Detection-Using-Deep-Learning-what-is-object-detection/

 

7. Image Captioning

전체 이미지에 대한 설명문을 자동 생성하는 문제 영역

ex) 이 이미지는 강아지가 자고 있는 모습이다. 이 이미지는 사람이 달려가는 모습이다. 등

출처 https://www.analyticsvidhya.com/blog/2018/04/solving-an-image-captioning-task-using-deep-learning/

 

8. Neural Style Transfer

콘텐츠 이미지(사진)에 스타일 이미지(명작,회화 등)를 덧씌운 합성 이미지를 만드는 문제영역

ex) 건물의 사진에 고흐의 <별이 빛나는 밤에>를 합성한 이미지

출처 https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-neural-style-transfer-ef88e46697ee

 

9. Generative Model

트레이닝 데이터의 분포를 학습하고 이를 이용해서 새로운 가짜 Fake 데이터를 생성하는 문제영역

 출처 https://www.kdnuggets.com/2020/03/generate-realistic-human-face-using-gan.html

 

10. Semantic Image Segmentation

이미지의 전체 픽셀에 대한 분류를 수행하는 문제영역

ex) 나무, 사람, 도로, 차도, 새 등 이미지의 픽셀마다 분류를 함

출처 https://theaisummer.com/Semantic_Segmentation/

 

11. Brain Tumor Segmentation

Brain 이미지 내에 종양(Tumor)이 있는 부분을 자동 분류하는 문제영역

출처 https://developer.nvidia.com/blog/automatically-segmenting-brain-tumors-with-ai/

 

12. Face Recognition

Face Detection이 진행된 상태에서 해당 Bounding box 위치에 존재하는 얼굴이 누구인지 신원(identity)를 식별하는 문제영역

출처 https://www.pyimagesearch.com/2018/06/25/raspberry-pi-face-recognition/

 

13. Face Verification

두 개의 얼굴 이미지를 인풋으로 받아서 해당 얼굴 이미지가 동일인물인지 아닌지를 판단하는 문제영역

출처 https://pralab.diee.unica.it/en/FaceVerification

 

14. Face Hallucination

얼굴 이미지에 대한 Super Resolution을 수행하는 문제영역

출처 https://paperswithcode.com/task/face-hallucination/codeless?page=4

 

 

15. Text Detection

이미지 내에 텍스트가 존재하는 영역의 위치정보를 Bounding Box로 찾는 문제영역

출처 https://cloud.google.com/vision/docs/ocr

 

16. Optical Character Recognition(OCR)

Text Detection이 수행된 Bounding Box 내에 존재하는 글자가 어떤 글자인지를 인식하는 문제영역

출처 https://m.blog.naver.com/rdproject/222113275331

 

17. License Plate Detection

Text Detection과 OCR을 이용해서 차량 번호판을 인식하는 문제영역

출처 https://medium.com/@quangnhatnguyenle/detect-and-recognize-vehicles-license-plate-with-machine-learning-and-python-part-1-detection-795fda47e922

 

18. Defect Detection

공정 과정상에 불량(Defect)을 검출하는 문제영역

출처 https://www.cognex.com/blogs/deep-learning/deep-learning-for-automotive-industry

 

19. Human Pose Estimation

인간의 중요 신체 부위를 Keypoint라는 점으로 추정해서 현재 포즈를 예측하는 문제영역

출처 https://towardsdatascience.com/realtime-multiple-person-2d-pose-estimation-using-tensorflow2-x-93e4c156d45f

'Study > Deep Learning' 카테고리의 다른 글

TensorFlow 2.0을 이용한 선형 회귀(Linear Regression) 알고리즘 구현  (0) 2021.10.15
TensorFlow  (0) 2021.10.15
머신러닝 Data 종류  (0) 2021.10.14
머신러닝 기본 프로세스  (0) 2021.10.14
딥러닝의 응용분야  (0) 2021.10.13

머신러닝 모델은 크게 트레이닝 과정과 테스트 과정으로 나뉜다.

▷ 트레이닝 과정 - 대량의 데이터와 충분한 시간을 들여 모델의 최적 파라미터를 찾음

▷ 테스트 과정 - 트레이닝 과정에서 구한 최적의 파라미터로 구성한 모델을 트레이닝 과정에서 보지 못한 새로운 데이터에 적용하여 모델이 잘 학습됐는지 테스트하거나, 실제 문제를 풀기 위해 사용

 

Data의 종류 = <Training Data, Validation Data, Test Data>

 

Validation Data

: 트레이닝 과정 중간에 사용하는 테스트 데이터

 

☞ 필요한 이유? 

트레이닝 과정에서 학습에 사용하지는 않지만 중간중간 테스트하는데 사용해서 학습하고 있는 모델이 Overfitting에 빠지지 않았는지 체크하기 위해서

 

 

Overfitting(과적합)?

: 트레이닝 데이터에 대한 에러는 작아지지만 검증용 데이터에 대한 에러는 커지는 현상

즉, 트레이닝 데이터에만! 초점이 맞춰서 학습이 된 경우이다. 따라서 학습한 데이터에 대해서는 오차가 감소하지만 실제 데이터에 대해서는 오차가 증가하게 된다.

 

출처 https://kite-mo.github.io/machine%20learning/2020/03/10/bOverfitting/

 

따라서 트레이닝 에러는 작아지지만 검증 에러는 커지는 지점에서 업데이트를 중지하면 최적의 파라미터를 얻을 수 있다.

 

'Study > Deep Learning' 카테고리의 다른 글

TensorFlow  (0) 2021.10.15
다양한 Computer Vision 문제 영역  (0) 2021.10.14
머신러닝 기본 프로세스  (0) 2021.10.14
딥러닝의 응용분야  (0) 2021.10.13
머신러닝/딥러닝 기초  (0) 2021.10.13

<머신러닝의 기본 프로세스 - 가설 정의, 손실함수 정의, 최적화 정의 >

① 학습하고자 하는 가설(Hypothesis) h(θ) 을 수학적 표현식으로 나타낸다

② 가설의 성능을 측정할 수 있는 손실함수(Loss Function) J(θ)을 정의한다

③ 손실함수 J(θ)을 최소화(Minimize)할 수 있는 학습 알고리즘을 설계한다

 

 

 

1. 가설 정의

ex) 선형 회귀 모델

y = Wx + b

 

x = 인풋 데이터  /  y = 타겟 데이터  / W와 b는 파라미터(θ) 

 

 

 

 

2. 손실함수 정의

: 적절한 파라미터 값을 알아내기 위해 이 과정이 필요

 

ex) 평균제곱오차(Mean of Squared Error, MSE)

사진출처 https://dailyheumsi.tistory.com/167

 yi = 정답값

y^i = 예측값

 

모델의 예측값이 정답과 멀다면 MSE 손실함수는 큰 값을 가지게 되고 정답에 가깝다면 MSE 손실함수는 작은 값을 갖게 됨

 

이처럼 손실 함수는 우리가 풀고자 하는 목적에 가까운 형태로 파라미터가 최적화 되었을 때(모델이 잘 학습되었을 때) 더 작은 값을 갖는 특성을 가짐

 

따라서 손실함수를 "비용 함수(Cost Function)"라고도 부름

 

 

 

 

3. 최적화 정의

최적화Optimization 기법 = 파라미터를 적절한 값으로 업데이트 하는 알고리즘

대표적인 기법 = Gradient Descent (경사하강법)

 

Gradient Descent

출처 https://codingslime.tistory.com/18

: 현재 스텝의 파라미터W에서 손실함수(cost)의 미분값에 러닝레이트(Learning rate) α 를 곱한만큼을 빼서 다음 스텝의 파라미터 값으로 지정

 

+ 학습률(Learning rate) = W에 변화를 주는 정도

 

 

따라서 손실 함수의 미분값이 크면 하나의 스텝에서 파라미터가 많이 업데이트 되고

손실 함수의 미분값이 작으면 적게 업데이트 됨

 

또한 러닝레이트α 가 크면 많이 업데이트되어 반복횟수가 줄어들고

러닝레이트α 가 작으면 적게 업데이트되어 반복횟수가 늘어난다.

 

출처 https://www.skyer9.pe.kr/wordpress/?p=437

 

+ Batch Gradient Descent, Stochastic Gradient Descent, Mini-Batch Gradient Descent

위에서 살펴봤던 경사하강법은 

 

트레이닝 데이터 n개의 손실함수 미분값을 모두 더한 뒤 평균을 취해서 파라미터를 한 스텝 업데이트 하는 방법이었다.

이런 방법을 전체 트레이닝 데이터를 하나의 Batch로 만들어 사용하기 때문에 Batch Gradient Descent 라고 부른다.

---> 트레이닝 데이터가 많아지면 파라미터를 한 스텝 업데이트하는데 많은 시간이 걸린다는 단점이 있다!

 

 

이와 반대로, Stochastic Gradient Descent 방법은 1개의 트레이닝 데이터만 사용하는 기법이다.

---> 파라미터를 자주 업데이트할 수 있지만 전체 트레이닝 데이터의 특성을 고려하지 않고 각각의 트레이닝 데이터의 특성만을 고려하므로 부정확한 방향으로 업데이트가 진행될 수 있다.

 

 

따라서, 실제 문제를 해결할 때는 이 둘의 절충적 기법인 Mini-Batch Gradient Descent 를 많이 사용한다.

전체 트레이닝 데이터 Batch가 1000(n)개라면 이를 100(m)개씩 묶은 Mini-Batch 개수만큼의 손실 함수 미분값 평균을 이용해서 파라미터를 한 스텝 업데이트 하는 기법이다.

 

 

'Study > Deep Learning' 카테고리의 다른 글

다양한 Computer Vision 문제 영역  (0) 2021.10.14
머신러닝 Data 종류  (0) 2021.10.14
딥러닝의 응용분야  (0) 2021.10.13
머신러닝/딥러닝 기초  (0) 2021.10.13
수치 미분  (0) 2020.11.06

<딥러닝 알고리즘의 주요 응용분야>

① Computer Vision

: 컴퓨터가 인간의 시각 기능을 수행할 수 있도록 하는 방법을 연구하는 분야

 

☞ 이미지 분류(Image Classification), Semantic Image Segmentation, 물체 검출(Object Detection) 등

딥러닝 여러 구조 중 CNN 구조가 많이 사용됨

 

ex) 테슬라 자동차의 Autopilot → 자율주행 기능. 주변 물체 감지를 통해 교통사고 발생률 줄임

 

 

② Natural Language Processing(NLP), 자연어 처리

: 컴퓨터가 인간의 언어처리 기능을 수행할 수 있도록 하는 방법을 연구하는 분야

 

☞ 문장 분류(Text Classification), 이미지 캡셔닝(Image Captioning), 기계 번역(Machine Translation), 챗봇(Chatbot) 등

딥러닝 여러 구조 중 RNN 구조가 많이 사용됨

 

ex) Google의 Duplex → 음성 가상 비서. 

 

 

③ Speech Recognition, 음성인식

: 컴퓨터가 인간의 음성인식 능력을 수행할 수 있도록 하는 방법을 연구하는 분야

 

☞ 음성 데이터가 표현하는 문장이 무엇인지를 인식(Speech To Text, STT)

 

ex) 애플 Siri, 구글 Now, 마이크로소프트 Cortana, 안드로이드 Bixby / 가정용 인공지능 스피커

 

 

④ Game

: 게임(시뮬레이션) 환경을 이용해서 인공지능 기술 발전을 연구하는 분야

(인공지능의 성능, 범용성 등을 측정하기 위해서 사용됨)

 

사용되는 대표적 머신러닝 알고리즘은 강화학습이며, 최근에는 DQN 기법이 많이 주목받고 있음

 

ex) 알파고 : 어려운 문제 해결 능력 / OpenAI Five : 전투봇. 복잡한 문제 환경 속 해결 능력

 

 

⑤ Generative Model, 생성모델

: 학습 데이터의 분포를 학습해서 학습한 분포로부터 새로운 데이터를 생성하는 방법을 연구하는 분야

 

ex) BEGAN : 새로운 얼굴 데이터 생성 / Deepfake : 원본 영상의 얼굴을 다른 사람으로 대체

 

 

'Study > Deep Learning' 카테고리의 다른 글

머신러닝 Data 종류  (0) 2021.10.14
머신러닝 기본 프로세스  (0) 2021.10.14
머신러닝/딥러닝 기초  (0) 2021.10.13
수치 미분  (0) 2020.11.06
신경망 학습  (0) 2020.11.06

1. 인공지능(Artificial Intelligence)

: 컴퓨터가 인간과 같이 생각할 수 있도록 만드는 기법을 연구하는 학문

 

2. 머신러닝(Machine Learning)

:: 데이터에 기반한 학습을 통해 인공지능을 구현하는 기법

:: "명시적인 프로그래밍 없이 데이터를 이용해서 컴퓨터가 어떤 지식이나 패턴을 학습하는 것"

:: "어떤 문제(Task)에 관련된 경험(Experience)으로부터 성과 측정 지표(Performance Measure)를 가지고 학습(Learn)을 진행하는 컴퓨터 프로그램  → 이때, T에 대한 성과는 P로 측정, E로부터 개선을 진행

 

<머신러닝 알고리즘의 3가지 분류>

① 지도학습(Supervised Learning)

: 정답 데이터가 존재하는 상황에서 학습하는 알고리즘

: 입력 데이터 x와 그에 대한 정답 레이블 y의 쌍 (x,y)를 이용해서 학습하는 알고리즘

: 목적 = 어떤 값에 대한 예측을 수행

 

이렇게 학습이 끝난 모델을 이용해서 결과값을 예측할 수가 있다.

1. 분류 문제(Classification) : 예측하는 결과값이 이산값(Discrete Value)인 문제(답이 딱딱 정해진, 분리된)

2. 회귀 문제(Regression) : 예측하는 결과값이 연속값(Continuous Value)인 문제(이렇게 계속 진행된다면 답은 ~일 것임)

 

딥러닝에서 지도학습 방법론으로 주로 사용되는 구조는 CNN(Convolutional Neural Networks), RNN(Recurrent Neural Networks) 이다.

 

② 비지도학습(Unsupervised Learning) 

: 정답 레이블 y 없이 입력 데이터 x만을 이용해서 학습하는 알고리즘

: 목적 = 데이터의 숨겨진 특징을 찾아내는

: 단독으로 사용하기 보다는 지도학습의 인풋 데이터로서 활용하여 지도학습의 성능을 끌어올리는 용도로 사용!

 

대표적인 방법론으로는 주성분 분석 Principal Component Analysis(PCA)이 있고

딥러닝에서 비지도학습 방법론으로 주로 사용되는 구조는 오토인코더 Autoencoder가 있다.

 

③ 강화학습(Reinforcement Learning)

: 에이전트(Agent)가 주어진 환경(State)에서 어떤 행동(Action)을 취하고 이에 대한 보상(Reward)를 얻으면서 학습을 진행

→ 이때, 에이전트는 보상을 최대화하도록 학습을 진행, 동적인 상태에서 데이터를 수집

: 대표적인 예시 = 알파고

 

대표적 알고리즘으로는 Q-Learning이 있고

최근에는 Q-Learning + 딥러닝 = DQN(Deep Q-Netwok) 기법을 많이 활용

 

 

3. 딥러닝(Deep Learning)

: 머신러닝 기법 중 하나인 인공신경망(Artificial Neural Networks) 기법의 은닉층(Hidden Layer)을 깊게 쌓은 구조를 이용해 학습하는 기법

 

장점?

- 데이터의 특징을 단계별로 추상화를 높여가면서 학습할 수 있음 ="표현 학습(Representation Learning)"

(ex : 얕은 은닉층에선 점,선,면과 같은 특징 학습 --> 깊은 은닉층에선 눈,코,입과 같은 특징 학습)

☞ 따라서 사람과 같은 고차원적 인지 활동을 수행할 수 있음

 

 

+) 딥러닝 알고리즘을 가능하게 만든 3가지 환경적 요인?

① 빅데이터(Big Data)를 구할 수 있는 환경이 조성됨

② GPU의 발전으로 컴퓨팅 환경이 개선됨

③ 새로운 알고리즘의 등장으로 딥러닝 모델을 더 잘 학습시킬 수 있게 됨

 

 

 

'Study > Deep Learning' 카테고리의 다른 글

머신러닝 Data 종류  (0) 2021.10.14
머신러닝 기본 프로세스  (0) 2021.10.14
딥러닝의 응용분야  (0) 2021.10.13
수치 미분  (0) 2020.11.06
신경망 학습  (0) 2020.11.06

파일 포맷을 알아야 할 필요성?

- 프로세스 적재를 위한 정보가 들어있음

- API 호출을 위한 IAT가 어떻게 존재하고 있는지 살펴볼 수 있음

- 코드 사이즈와 각 섹션의 위치를 담고 있음

- 언패킹, 안티 디버깅 방법 알 수 있음

- 바이러스 분석 시 필요함

 

 

PE 파일

: 파일(File)이 이식 가능한 다른 곳에 옮겨져도(Portable) 실행 가능하도록(Executable) 만든 포맷(Format)

 

출처 : 인프런_윈도우 악성코드(malware) 분석 입문 과정 강의자료

프로그래머가 작성한 코드는 CPU가 실행할 수 없다. 따라서 컴파일, 어셈블 과정을 거쳐 CPU가 이해할 수 있는 기계어로 이루어진 목적 파일로 변경된다. 하지만 이 목적 파일(obj)은 직접 실행할 수 없는 파일이다. 표준 라이브러리, 사용자 라이브러리 등을 포함하고 있지 않기 때문. 따라서 링킹을 통해 필요한 라이브러리를 obj 파일과 연결하는 과정(링킹)이 필요하고, 이 과정이 끝나면 실행 가능한 exe 파일이 생성된다.

 

 

<PE헤더 복구 실습>

실행되지 않는 파일
PE 헤더 부분에 어떠한 값이 들어있다.
크기 비교 결과 역시나 16바이트가 더 많다.
HxD를 통해 해당 줄을 지워주고 저장
정상 복구

 

 

또 다른 파일 예시. HxD의 [Analysis] - [File-compare] - [Compare] 등을 통해서도 쉽게 비교 가능

 

 

패커(Packer)

: 실행 파일 압축기

 

- 사용 목적 : PE 파일 내부 코드와 리소스(string, API 등)를 감추기 위한 목적

               + 프로텍터 (패킹 기술로 리버싱을 막기 위한 다양한 기법을 추가하는 것. 쓰레기 코드를 넣어 원본보다 크기가 커질 수 있음)

 

※ 각종 백신 우회 방법

- 시그니처 변경 (단순히 변수 몇 개를 추가 및 함수 위치를 변경하여 리빌드)

- 쓰레기 코드를 통한 우회 방법 (네 줄이 수행된 결과를 보면 아무것도 바뀌는 것이 없음(대칭 구조))

- 헤더 변조 (TimeDateStamp, Optional Header의 CheckSum, 메모리 속성 변조) -> 해시값 변경

- 대체 가능한 어셈블리어 (sub ebp, 7 >> add ebp, 7..)

- 실행조차 되지 않는 코드

 

 

* Themida

출처 https://www.oreans.com/Themida.php

: 지상 최고의 패커, 안티 디버깅과 안티 분석, 언패킹 분석을 매우 어렵게 하는 안전한 패커이다.

VMware, 디버거, 프로세스 모니터(ProcMin, Process Monitor) 분석을 방지하는 기능(자신을 분석하는 줄 알고)

패킹된 실행 파일은 이례적으로 크기가 큼

언패커가 존재하나 Themida 버전과 프로그램을 패킹할 때 사용한 설정에 따라 성공률이 다르다

 

 

<UPX>

오리지널 notepad 파일
upx.exe ori_notepad.exe 명령어로 패킹
언패킹은 이렇게. -d 옵션을 주면 됨
원본 파일을 건드리지 않고 패킹된 새로운 파일 생성할 떄는 -o 옵션
새로 생성된 파일

 

ori_notepad_upx 의 어셈블리 코드

UPX의 특징? PUSHAD & POPAD

 

먼저, 01015320 PUSHAD 명령어를 통해 EAX~EDI 레지스터 값이 스택에 저장, 

그 후 POPAD를 통해 레지스터 복구 후 원래 코드의 Entry Point로 가게 된다.

 

 

upx 로 패킹되어 있는 파일
PUSHAD 실행
ESP 위치로 가서 Hardware Breakpoint를 건다
그러면 POPAD 명령어까지 실행된 이후의 상황이 된다. 원래 처음의 레지스터 상태로 돌아온 것 

00401000 이 OEP인 것을 확인할 수 있다.

(원본 프로그램 시작)

 

 

OllyDBG의 플러그인을 사용해 덤프를 뜨겠다
Rebuile Import 체크 해제, DUMP 파일 따로 저장

여기서의 Import 내용을 DUMP 뜬 파일에 수동으로 재구축할 것이다.

 

OEP와 Import Size를 변경해주었다.
Fix Dump 결과

'Study > Reversing' 카테고리의 다른 글

악성코드 분석  (0) 2021.11.03
Lena 2번 풀이/Rena's Reversing Tutorial 02  (0) 2021.10.27
리버싱 기초 & reverseMe.exe 분석  (0) 2021.09.28
악성코드 유형  (0) 2021.09.18
Suninatas_11번 문제 풀이  (0) 2021.05.19

C ----컴파일----> CPU가 읽을 수 있는 언어(기계어) 11010011 ----디스어셈블 ----> 어셈블리어

 

어셈블리어

- 한 가지 동작까지 세세하게 지정

- 주로 IA-32 를 사용(Intel)

- 기본형태 : 명령어(opcode) + 인자(operand 1~2)

 


CPU가 사용하는 변수, 저장공간 (레지스터)

:: EAX (연산 Accumulator, 리턴 값 저장)

:: EBX, EDX (목적이 없는 레지스터, 공간 필요시 사용)

:: ECX (for문에서 i의 역할 Count, 변수로 사용해도 무방)

:: ESI, EDI (source index, destination index. 문자열이나 반복데이터 처리, 메모리 옮기는데 사용)

:: ESP (스택포인터)

:: EBP (베이스포인터)

:: EIP (인스트럭션 포인터, CPU가 실행할 명령어를 가리킴)


어셈블리 명령어

- PUSH, POP (PUSHAD, POPAD) : 모든 레지스터에 있는 값들을 스택에 push, pop

- MOV : source를 가져옴

- LEA : source의 주소를 가져옴

- ADD : +

- SUB : -

- INT : 잠깐 정지

- CALL : 함수 호출

- INC, DEC : i++, i--

- AND, OR, XOR : bit 연산

- NOP : 실행하지 않고 다음 단계로 넘어감

- CMP, JMP : 비교, 점프

 


리버스 엔지니어링에 필요한 스택

> 함수 프롤로그 & 함수 에필로그

함수 프롤로그는 스택을 만드는 역할, 에필로그는 스택을 지우는 역할을 한다.

 

ex) main함수에서 plus라는 함수를 또 호출하는 상황 = 프롤로그

push ebp          이전 함수의 ebp를 스택에 저장하기 위해

mov ebp, esp     esp 값을 ebp에 저장. 같은 곳을 가리키게 됨

sub esp, 50h      esp에서 50h 위치만큼 값을 줄임(esp가 위로 상승) 

                        --> 그 결과, 새로운 plus 함수를 위한 스택 공간이 할당됨

 

.....

 

plus 함수에서 main 함수로 돌아가는 상황 = 에필로그

mov esp, ebp     돌아가기 위해(스택 정리) ebp를 esp에 할당해줌

pop ebp            ebp를 스택에서 빼면 main 함수의 다음행 주소가 스택에 있고 

retn                  main 함수로 돌아간다.

 

 


<reverseMe.exe 분석>

 

만료일이 다 됐으니 라이선스를 구매하라는 문구가 뜨고 확인을 누르면 그대로 꺼진다

 

이 파일을 제대로 동작하게 만들어 보겠다

 

실행파일의 전체적 코드

코드를 보다보니 CreateFileA 함수가 눈에 띈다.

MSDN에서 찾아봤다.

 

CreateFile 함수는 파일을 생성하는 것뿐만 아니라 파일을 읽어오기도 한다고 한다.

그리고 코드 내에서 dwShareMode가 OPEN_EXISTING 값을 가지는데 이것은 무슨 의미인지 확인해보았다.

 

CreateFile이라고 해서 단순히 File을 생성하는 것인줄 알았으나 

제대로 알아보니 file 또는 장치가 있다면 이를 열어주는 작업을 하고 있다.

 

CreateFile 함수 이후

EAX와 -1을 비교하고 있다. EAX에 FFFFFFFF가 들어있으므로 둘은 같다.

따라서 CMP 문을 지나면 ZF가 1(참)이 되고, JNZ 명령어를 따를 필요가 없으므로 

처음에 봤던 문장 "Evaluarion period out,,,," 을 띄우는 MessageBox 함수 부분을 실행한다.

 

 

그래서 일단 

ZF를 0으로 임시로 바꿔준 후 ReadFile 함수를 실행하도록 한다.
ReadFile 함수 이후

TEST EAX, EAX 명령어를 실행한다.

EAX는 0 이므로 ZF는 1이 되어

JNZ를 따르지 않고 그 밑의 JMP 명령어를 실행한다.

 

JMP 명령어 이후

파일이 존재하지 않는다는 오류와 함께 프로세스가 종료된다.

 

그렇다면 이 파일이 존재할 때는 어떨까?

 

Keyfile.dat 파일 생성
저장

 

ReadFile 함수 결과

그 결과 EAX가 1의 값을 가지는 것을 알 수 있고

 

원하던 위치로 오게 되었다.

XOR 명령어로 EBX와 ESI를 각각 0으로 만들어준 후

CMP DWORD PTR DS:[412173], 10 명령어로 402173에 있는 값과 10을 비교하고 있다.

밑에 나와있듯이 DS:[00402173]값은 4이므로 

JL 명령어를 따라 004010F7 위치로 점프하게 된다.

 

 

그러면 00402173에 있는 값이 10보다 크면 될까?

(이 값이 무엇을 의미하는지 나중에 알게 됐다)

 

00402173 값을 a로 변경하여 HEX 값이 10보다는 크게 만든다
40211A에 있는 값을 AL로 MOV 한다

0040211A부터는 우리가 적었던 내용인 test가 있고 여기서부터 파일의 내용을 다루는 것 같다.

 

MOV 명령어 이후 AL = 74('t') 이므로 

CMP AL, 0 결과는 1 

같지 않기 때문에 JE 명령어를 건너뛰고 

CMP AL, 47 명령어로 AL과 47('G')을 비교한다.

 

비교 결과 같지 않기 때문에 

INC ESI를 건너뛰고

INC EBX로 바로 간다.

이것을 4번 반복하고 (입력한 내용만큼 반복)

CMP ESI, 8 명령어를 실행한다.

ESI는 0이기 때문에 JL 명령어를 실행하지 않고 바로 아래 명령어를 실행하고 ,,

 

그 결과 

성공

 

따라서 유추해보면 Keyfile.dat에 들어있는

글자수는 16 이상이어야 하고, 8개 이상의 G 문자가 필요한 것이다. 

 

 

 

 

 

Keyfile.dat 수정

 

성공

'Study > Reversing' 카테고리의 다른 글

Lena 2번 풀이/Rena's Reversing Tutorial 02  (0) 2021.10.27
윈도우 실행 파일과 패커  (0) 2021.10.06
악성코드 유형  (0) 2021.09.18
Suninatas_11번 문제 풀이  (0) 2021.05.19
Reversing.kr _Easy Unpack 풀이  (0) 2021.05.18

+ Recent posts