❗️이 포스팅은 인프런의 [스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB접근 기술] 강의를 정리한 내용입니다.❗️

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

[스프링 입문기 2] 라이브러리 살펴보기

라이브러리 살펴보기

  • Gradle은 의존 관계에 있는 라이브러리를 함께 다운로드 한다.
  • Gradle이란 오픈소스 빌드 자동화 툴이다. 거의 모든 타입의 소프트웨어를 빌드할 수 있다고 한다.
  • 오른쪽 사이드바에 있는 Gradle 버튼을 눌러서 Dependencies를 확인할 수 있다.

라이브러리 확인 방법

스프링 부트 주요 라이브러리 

  • spring-boot-starter-web 
    • spring-boot-starter-tomcat : 톰캣 -> 웹서버를 담당
    • spring-webmvc : 스프링 웹 MVC
  • spring-boot-starter-thymeleaf : 타임리프 템블릿 엔진 -> 뷰를 담당
  • spring-boot-starter(공통) : 스프링 부트 + 스프링 코어 + 로깅
    • spring-boot
      • spring-core
    • spring-boot-starter-logging 
      • logback, slf4j

테스트 주요 라이브러리

  • spring-boot-starter-test
    • junit : 테스트 프레임워크
    • mockito : 목 라이브러리
    • assertj : 테스트 코드를 좀 더 편하게 작성하도록 도와주는 라이브러리
    • spring-test : 스프링 통합 테스트 지원

 

 

 

 

 

 

 

반응형
SMALL

❗️이 포스팅은 인프런의 [스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB접근 기술] 강의를 정리한 내용입니다.❗️

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

[스프링 입문기 1] 프로젝트 환경설정

준비

  • Java 17 설치
  • IntelliJ 설치

스프링 프로젝트 생성

https://start.spring.io/ : 스프링 부트 스타터

Spring Boot Starter 페이지

  • Project : Gradle - Groovy
  • Spring Boot : 3.1.2 (SnapShot이라고 되어 있는 것은 아직 정식 출시가 안 된 버전을 의미)
  • Language : java
  • Java : 17
  • Dependencies : Spring Web(웹 기반 프로젝트), Thymeleaf(템플릿 엔진 중 하나) 추가해주기

-> 하단에 Generate 버튼 눌러주기

-> 다운받은 폴더를 압축 풀기해주기

-> 폴더 안에 있는 build.gradle 파일을 IntelliJ에서 열어주기

폴더 계층 살펴보기

1. src 폴더

  • main 폴더와 test 폴더로 나누어져 있음.
    • main 폴더 : java 폴더 / resources 폴더(실제 자바 코드를 제외한 xml, html파일이나 설정 파일이 포함)
    • test 폴더 : test code가 들어 있음. (요즘 개발 트렌드에서는 Test code가 매우 중요하다.)

2. .gitignore

  • git에는 딱 필요한 소스코드만 올라가야 함. 
  • build된 결과물 등은 필요하지 않기 때문에 이를 관리해주는 파일.

3. build.gradle 파일

  • 초기 설정한 version이나 dependencies 내용이 들어 있는 파일.

build.gradle 파일

Spring Boot 실행해보기

  • src -> main -> hello -> hellospring -> HelloSpringApplication 파일 
  • main 함수 실행 (왼쪽에 초록색 run 버튼 클릭)

 

반응형
SMALL

1. LeNet-5란?

LeNet-5은 1998년에 개발된 초기 CNN 구조로, 이후 딥러닝의 기반을 마련한 모델이라고 할 수 있다.

LeNet-5 구조


2. 각 Layer 살펴보기

(1) Input Layer (입력층) 

LeNet-5의 입력은 32x32 크기의 흑백 이미지이다. Input 이미지는 0과 1 사이의 값으로 정규화된다.

(2) C1 Layer (Convolution)

LeNet-5는 두 개의 Convolution Layer을 가지고 있는데, 첫 번째 Convolution layer는 6개의 5x5 크기의 필터를 사용한다. 합성곱 연산 결과 6장의 28x28 feature map을 얻게 된다. 활성화 함수는 sigmoid 함수를 사용한다.

(3) S2 Layer (Subsampling)

Convolution layer 이후 평균 풀링을 진행한다. 2x2 window와 stride 2를 사용하여 feature map이 반으로 줄어든다. 즉, 결과적으로 6장의 14x14 feature map을 얻게 된다.

(4) C3 Layer (Convolution)

두번째 Convolution layer는 첫 번째 합성곱 레이어와 유사한 구조를 가지고 있지만, feature map의 깊이가 6에서 16으로 증가한다. 이 층에서도 활성화 함수는 sigmoid 함수를 사용한다. 

(5) S4 Layer (Subsampling)

첫 번째 평균 풀링 layer와 마찬가지로 2x2 window와 stride 2를 사용하여 입력 이미지의 공간 해상도를 다시 줄입니다. 

(6) C5 Layer (Convolution)

16장의 5 x 5 특성맵을 120개의 5 x 5 x 16 사이즈의 필터와 합성곱 연산을 진행한다. 결과적으로 120개의 1 x 1 feature map이 나온다.

(7) F6 (Fully Connected Layer)

이제 입력 이미지는 Fully Connected Layer로 전달된다. 이 layer는 86개의 뉴런으로 구성되어 있으며, 이전 layer의 모든 feature map과 연결된다. Fully Connected Layer는 입력에 대한 weight 합과 bias을 계산하고, sigmoid 활성화 함수를 사용한다.

(8) Output Layer (출력층)

LeNet-5의 출력층은 10개의 뉴런으로 구성되어 있다. 이 레이어는 입력 이미지가 0부터 9까지의 숫자를 나타내는 확률 분포로 매핑되도록 설계되었다. 출력 뉴런 중 가장 높은 값을 가진 뉴런이 모델의 예측 결과로 사용되는 것이다.


3. Tensorflow 코드 구현하기

(1) 필요 라이브러리 가져오기

import numpy as np
import tensorflow as tf
import tensorflow.keras.datasets as ds

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPooling2D,Flatten,Dropout,Dense
from tensorflow.keras.optimizers import Adam

(2) 데이터셋 전처리 

(x_train,y_train),(x_test,y_test)=ds.mnist.load_data()
x_train=x_train.reshape(60000,28,28,1) # 60000개의 데이터 -> 28x28x1 (grayscale)
x_test=x_test.reshape(10000,28,28,1) # 10000개의 데이터 -> 28x28x1 (grayscale)

x_train=x_train.astype(np.float32)/255.0 # 0~255의 픽셀 값 -> 0~1 사이의 값으로 정규화
x_test=x_test.astype(np.float32)/255.0

y_train=tf.keras.utils.to_categorical(y_train,10) # 0~9 값을 원핫 코드로 변환
y_test=tf.keras.utils.to_categorical(y_test,10)

(3) 층 쌓기

cnn=Sequential()
# C1 : 6개 5x5 filter, zero padding -> output_shape = (28, 28, 6)
cnn.add(Conv2D(6,(5,5),padding='same',activation='relu',input_shape=(28,28,1)))

# S2 : 2x2 filter, stride = 2 -> output_shape = (14, 14, 6)
cnn.add(MaxPooling2D(pool_size=(2,2),strides=2))

# C3 : 16개 5x5 filter, padding 안함 -> output_shape = (10, 10, 16)
cnn.add(Conv2D(16,(5,5),padding='valid',activation='relu'))

# S4  : 2x2 filter, stride = 2 -> output_shape = (5, 5, 16)
cnn.add(MaxPooling2D(pool_size=(2,2),strides=2))

# C5 : 120개 5x5 filter, padding 안함 -> output_shape = (1, 1, 120)
cnn.add(Conv2D(120,(5,5),padding='valid',activation='relu'))

# 120
cnn.add(Flatten())

# 120 -> 84
cnn.add(Dense(units=84,activation='relu'))

# 84 -> 10
cnn.add(Dense(units=10,activation='softmax'))

(4) 학습, 정확도 계산

cnn.compile(loss='categorical_crossentropy',optimizer=Adam(learning_rate=0.001),metrics=['accuracy'])
cnn.fit(x_train,y_train,batch_size=128,epochs=50,validation_data=(x_test,y_test),verbose=2)

res=cnn.evaluate(x_test,y_test,verbose=0)
print('accuracy=',res[1]*100)

 

반응형
SMALL

이번 포스팅에서는 딥러닝 모델의 연속 학습(Continual Learning)에 대하여 다뤄보고자 한다.

연속 학습(Continual Learning)이란?

인공지능의 연속학습(Continual Learning)이란 딥러닝 모델이 새로운 데이터를 기반으로 지속적으로 학습하는 방법을 말한다. 일반적인 딥러닝 모델은 큰 규모의 데이터셋으로 학습하고, 해당 데이터셋을 기반으로 일반화된 패턴을 학습한다. 그러나 실제 환경에서는 새로운 데이터가 지속적으로 발생하고, 이는 기존의 데이터와는 다를 가능성이 높다. 연속학습은 이러한 기존 딥러닝의 문제점을 보완하고자 새로운 데이터에 대해 지속적으로 학습하고, 학습한 지식을 점진적으로 확장해나간다. 

이 사진에서 보다시피 데이터는 연구의 방향이나 시장의 수요에 따라서 클래스가 분화된다. 클래스가 점차 분화되고 새로운 클래스가 등장함에 따라 새로운 데이터에 대해 지속적으로 학습할 수 있는 인공지능 모델이 필요해지게 된 것이다. 새로운 데이터가 나올 때마다 처음부터 다시 훈련시키는 것 보다는, 이미 학습된 모델에 새로운 데이터만 추가하는게 더 효율적이고 경제적이라고 할 수 있기 때문이다.

연속 학습의 가장 큰 문제점 : Catastrophic Forgetting

이 연속학습의 가장 큰 문제점은 바로 이 치명적 망각(Catastrophic Forgetting)이다. 이를 이해하기 위해서 다음 그림을 살펴보자.

split-MNIST의 task들

위 사진은 바로 대표적인 데이터셋 중 하나인 MNIST 데이터셋을 5개의 task로 나눈 것이다. 첫 번째 task1에서는 0과 1을 구분하도록 모델을 학습시킨다. 그 다음, 이 학습된 모델에 2와 3을 구분하도록 또 다시 학습시킨다. 이런 방식으로 앞에서 학습된 모델에 연속적으로 새로운 task를 훈련시키면 가장 큰 문제점은 앞에서 훈련되었던 내용을 잊어버린다는 것이다. 8과 9를 구분하는 마지막 task5를 훈련시키고 나면, 가장 처음에 훈련되었던 0과 1을 분류하는 task1은 정확도가 상당히 낮아진다. 즉, 점진적으로 모델을 학습해감에 따라 앞에서 학습되었던 내용을 점차 잊어버리는 것이다. 이를 연속학습에서는 치명적 망각(Catastrophic forgetting)이라고 부르며, 이를 해결하는 것이 연속학습의 핵심이라고 할 수 있다.

연속 학습의 대표적인 방법

연속 학습 방법은 크게 Replay method, Regularization-based method, Parameter isolation method로 분류할 수 있다. 

연속 학습의 대표적인 Method

1. Replay method

Replay 방법은 이전 작업의 데이터를 저장하고, 새로운 task에 대한 학습에서 이전 데이터를 다시 사용하는 방식이다. 이전 데이터를 다시 사용하는 방식은 버퍼에 일부 데이터를 저장(real data replay)하거나 생성모델을 통해 데이터를 생성(pseudo replay)하여 사용하는 방식이 있다. 이 방식은 연속학습의 문제점이었던 Catastrophic Forgetting을 어느 정도는 해결할 수 있으나 이전의 데이터를 메모리에 넣어 주어야 하기 때문에 많은 양의 메모리 공간이 요구된다는 점, 실제로 순차적 학습을 할 때 다시 과거 데이터에 접근할 수 있다는 보장이 없다는 점에서 여전히 문제점이 존재한다.

Generative Replay(2017)

대표적인 Replay 방식으로는 Generative Replay가 있다. Generative Replay는 새로운 task를 학습할 때 생성모델을 통해 데이터를 생성하여 이전 데이터를 다시 사용하는 방식을 택한다.

Generative Replay의 구조

Generative Replay는 Generator와 Solver의 구조를 가지고 있다. Generator는 이전에 학습했던 데이터를 재생산하고 Solver는 이 재생산된 데이터와 진짜 데이터를 이용해 분류하는 역할을 하도록 학습된다. 이런 구조 전체를 Scholar라고 하고 각 task마다 Scholar의 구조를 순차적으로 학습한다. 

2. Regularization-based method

다음으로는 Regularization-based 방식이 있다. 이 방식은 모델의 파라미터를 조절하여 이전 작업에 대한 지식을 보존하는 방식이다. 즉, 모델의 성능에 영향을 주는 활성화 함수(activation function), 옵티마이저 (Optimizer), 학습률 (Learning Rate) 등의 파라미터의 impact를 계산하여 이전 작업의 중요한 impact를 주는 파라미터는 이후의 학습에서도 보호하겠다는 것이다. 

LwF(Learning Without Forgetting, 2017)

Regularization-based method의 대표적인 모델로는 LwF(Learning Without Forgetting, 2017)가 있다. LwF는 각 stage의 학습을 시작하기 전에 현재 stage의 모든 데이터에 대해 이전 stage에서 학습이 완료된 모델의 feed-forward logit(LwF-logit)을 미리 계산하고, 각 데이터의 label과 LwF-logit을 이번 stage 학습에 활용한다. Label은 새로운 학습을 위해 사용되고, LwF-logit은 과거의 데이터를 보존하는데 사용된다.

위 그림은 다른 multi-task learning method(b, c, d)와 LwF(e)를 비교해놓은 그림이다. 이 그림에서는 각 부분의 색깔을 잘 확인할 필요가 있다. 주황색은 random initialize + train, 하늘색은 fine-tune, 흰색은 unchanged를 의미한다. 따라서 무엇이 학습되었는지, 학습이 되지 않았는지를 구분할 수 있다. 하나씩 살펴보자.

  • (b) Fine-tuning : 네트워크의 backbone과 새로운 task에 대하여 학습시키는 방식이다. 이 방식의 문제점은 이전에 학습된 파라미터(그림의 하얀색 부분)의 guidance 없이 공유된 파라미터들을 업데이트 시키기 때문에 이전에 학습된 task의 성능을 저하시킨다는 것이다. 
  • (c) Feature Extraction : Fine-tuning과는 달리, 사전 학습된 네트워크의 backbone을 다시 학습하는 대신에, 새로운 task에 더 많은 layer을 추가하고 이 branch만 학습한다. backbone과 공유된 파라미터를 업데이트 시키지 않기 때문에, 새로운 task의 특징을 잘 표현하기에 성능이 떨어지는 경우가 많다.
  • (d) Joint Training : 이 방식은 새로운 task를 위한 새로운 브랜치를 추가하고 전체 네트워크를 다시 학습한다. 다시 말해서, 모든 task의 데이터를 동시에 함께 사용하여 학습한다는 것이다. 정확성 측면에서는 가장 효율적인 방법으로 보일 수 있다. 하지만 더 많은 task가 추가되면 점점 더 학습하는 데 번거로울 수 있으며, 이전 작업의 학습 데이터를 사용할 수 없는 상황에서는 적절하지 않을 수 있다는 문제점이 있다. 
  • (e) LwF : LwF 방식은 새로운 task를 위하여 branch를 추가하지만, 새로운 task에 대한 학습을 진행할 때에는 이전 task의 데이터를 사용하지 않는다. 대신 Knowledge Distillation(지식 증류) 기법을 사용하는데, 지식 증류는 큰 규모의 미리 trained된 모델(선생님)로부터 작은 모델(학생)로 지식을 전달하는 기법이다. LwF에서는 이전 task에서 학습된 모델을 "선생님"으로 정의하고, 새로운 task를 위해 학습 중인 모델을 "학생"으로 정의한다.

3. Parameter isolation method

이 방식은 용어 그대로 task 간의 파라미터를 분리하여 각 task의 파라미터를 독립적으로 학습하는 방식이다. 이를 통하여 task 간의 간섭을 줄이고 각 task에 대한 성능을 개별적으로 관리할 수 있다.

PNN(Progressive Neural Network, 2016)

three column progressive network.

첫 번째 column은 task1, 두 번째 column은 task 2에 학습되었다. 세 번째 column은 마지막 task를 위하여 이전에 학습된 모든 특성에 접근할 수 있도록 추가된 column이다. 이 모델은 task가 늘어날 때마다 column을 추가한다. 이전의 column들은 새로운 데이터에 학습되지 않고 고정된다. 이렇게 되면 새로운 task가 추가되더라도 이전의 파라미터는 변경되지 않으며 독립적으로 학습된다는 것이 특징이다.

반응형
SMALL

아래 사이트(Machine Learning For Kids)에서 정말 간단하게 챗봇을 위한 인공지능 모델을 구축하고 사용해 볼 수 있다. 앱 인벤터를 이용하면 이 챗봇을 간단하게 앱으로도 구현해 볼 수 있다. 플랫폼과 파이썬을 사용하여 간단한 인공지능 챗봇을 구축해보고자 한다. 

 

Machine Learning for Kids

An educational tool for teaching kids about machine learning, by letting them train a computer to recognise text, pictures, numbers, or sounds, and make things with it in Scratch.

machinelearningforkids.co.uk

 

챗봇(ChatBot)이란?

우선, 챗봇이 무엇인지부터 알아보자. 챗봇은 ChatterBot의 약자로서, 말 그대로 이야기를 주고받는 로봇을 의미한다.

챗봇은 크게 트랜잭션 챗봇대화형 챗봇으로 나눌 수 있다.

  1. 트랜잭션 챗봇 : 하나의 기능을 수행하거나 자동화하는 데 주력하는 단일 용도의 챗봇을 말한다. 예를 들어 레스토랑이나 택배 회사, 은행 등에서 간단한 질문에 답하거나 업무를 수행할 때 사용된다. 
  2. 대화형 챗봇 : 보다 개인 맞춤화된 상호 작용에 사용되는 챗봇을 말한다. 트랜잭션 챗봇처럼 단일 용도로 사용되는 것이 아니라 사용자와 상호작용하며 마치 사람과 대화를 하듯 답변하도록 설계된다. 대표적으로 ChatGPT가 있을 것이다. 

챗봇 구현하기

이제 실제 챗봇을 구현하기 위한 모델을 위 플랫폼을 사용하여 구축해보자. 여기서는 호텔 안내 서비스 챗봇을 만들어 볼 예정이다.

1. 프로젝트 만들기

가장 먼저 머신러닝 프로젝트를 만들어야 한다. 우측에 있는 프로젝트 추가 버튼을 클릭한다.

그다음, 프로젝트의 세부사항을 입력한다. 여기서는 호텔 안내 챗봇을 만들어볼 것이기 때문에 프로젝트 이름은 "Hotel", 인식은 "텍스트", 언어는 "Korean"으로 선택하였다.

2. 훈련

프로젝트를 생성하면 다음과 같은 페이지가 나온다. 모델을 훈련시키기 위하여 가장 좌측에 있는 [훈련] 버튼을 클릭하자.

[훈련] 버튼을 클릭하면 다음과 같은 페이지가 나온다. 여기서 우측에 있는 [새로운 레이블 추가] 버튼을 누르고 자신의 챗봇에 맞는 질문 레이블을 추가하면 된다. 여기서는 호텔 안내 서비스이기 때문에 총 6개의 레이블(reservation, facility, location, service, price, checkinout)을 추가하였다. 

그다음, 각 질문 레이블에 맞는 데이터를 추가한다. 데이터는 고객이 질문할 만한 질문 데이터들을 입력해 주면 된다. 한 레이블당 약 7개 정도의 데이터를 추가하였다. 데이터는 당연히 많을수록 좋다. 

3. 학습 & 평가

이제 좌측 상단에 있는 [프로젝트로 돌아가기] 버튼을 누른 후, 학습&평가 버튼을 클릭하면 다음과 같은 화면이 나온다. 하단에 있는 [새로운 머신러닝 모델을 훈련시켜 보세요] 버튼을 클릭하자.

잘 학습이 완료되면 다음과 같은 페이지가 나온다. 모델이 잘 학습되었는지 간단하게 문자를 넣어 테스트도 해볼 수 있다.

간단하게 테스트를 진행해 본 결과는 다음과 같다. 인식된 레이블의 이름과 confidence 값이 함께 출력되는 것을 확인할 수 있다.

4. 만들기

이제 이 구축된 모델을 이용하여 챗봇을 만들어볼 것이다. 프로젝트로 돌아가서 만들기를 누르면 다음과 같은 화면이 나온다. 보다시피 스크래치나 파이썬, 앱 인벤터로 간단하게 챗봇을 만들 수 있다. 여기서는 파이썬을 이용해 볼 것이다. 

[파이썬] 버튼을 클릭하면 다음과 같은 화면이 나온다. 여러 방법이 소개되어 있는데, 코랩에 연결하여 사용하기 위해 우측에 있는 [내 컴퓨터에서 실행하도록 코드를 복사하세요.] 버튼을 클릭한다. 

그러면 다음과 같은 페이지가 나오고, 이 코드를 복사하여 그대로 코랩에 붙여 넣기 한다. 사진에서 빨간색 부분만 수정가능하다. 

각 질문 레이블에 맞는 답변을 다음과 같이 구성하였다.

while True:
    question = input("호텔에 대해서 궁금한 것을 저에게 물어보세요! 질문이 끝나시면 '나가기'를 입력해주세요.")

    if (question == "나가기") :
      break

    answer = classify(question)

    label = answer["class_name"]
    confidence = answer["confidence"]

    if confidence < 60 :
        print("제가 질문을 잘 이해하지 못했어요. 다시 질문해주세요.")

    elif (label == "reservation") : 
        print("호텔 예약과 관련된 정보는 저희 호텔 홈페이지에서 확인하실 수 있습니다.")
        print("답변 정확도 :", confidence)

    elif (label == "facility") :
        print("저희 호텔에는 헬스장, 수영장, 식당 등이 있습니다. 자세한 사항은 저희 호텔 홈페이지를 참고해주세요.")
        print("답변 정확도 :", confidence)

    elif (label == "location") :
        print("저희 호텔은 서울특별시 강남구에 위치해있습니다. 강남역 바로 앞에 위치해 있어 교통이 편리합니다.")
        print("답변 정확도 :", confidence)

    elif (label == "service") :
        print("저희 호텔은 전 객실 와이파이가 가능하며, 룸서비스 및 어메니티 서비스를 이용하실 수 있습니다.")
        print("답변 정확도 :", confidence)

    elif (label == "price") :
        print("호텔 객실 요금 정보는 저희 호텔 홈페이지에서 확인해주세요.")
        print("답변 정확도 :", confidence)

    elif (label == "checkinout") :
        print("체크인 시간은 오후 3시이며, 체크아웃 시간은 오후 12시입니다.")
        print("답변 정확도 :", confidence)

5. 실행결과

실행 결과는 다음과 같다.
  • 입력 : 호텔 예약을 하고 싶어요.
  • 출력 : 호텔 예약과 관련된 정보는 저희 호텔 홈페이지에서 확인하실 수 있습니다. / 답변 정확도 : 82
  • 입력 : 체크인은 언제부터 가능한가요.
  • 출력 : 체크인 시간은 오후 3시이며, 체크아웃 시간은 오후 12시입니다. / 답변 정확도 : 98
  • 입력 : 헬스장을 이용할 수 있나요.
  • 출력 : 제가 질문을 잘 이해하지 못했어요. 다시 질문해주세요. 

마치며..

Dialogflow로도 간단하게 챗봇을 구축할 수 있지만, 인공지능을 처음 배우는 학생들에게는 조금 난이도가 어려울 것 같아서 machine learning for kids 플랫폼을 사용하였다. 요즘 핫한 ChatGPT 정도의 챗봇을 만드는 것은 당연히 불가능하지만 난이도도 어렵지 않고 다양하게 활용이 가능해서 학생들이나 처음 인공지능을 공부하는 사람들에게는 한 번쯤 활용해 볼 만한 플랫폼인 것 같다. 

 

반응형
SMALL

드롭박스(Dropbox)는 전 세계 600,000개의 팀이 사용하고 있는 클라우드 스토리지 서비스이다.

사진 : 드롭박스

드롭박스는 지난 6월 22일 인공지능(AI) 기반 검색 도구 '드롭박스 대시(Dropbox Dash)'베타버전을 공개하였다. 드롭박스 대시는 인공지능을 기반으로 검색창 하나에 모든 툴, 콘텐츠, 앱을 연결해 주는 플랫폼이다. 이를 통하여 사용자는 다른 곳에 필요한 정보를 찾거나 정리 및 관리하는 시간을 줄일 수 있는 것이다. 

드롭박스 대시는 구글 웍스페이스, 마이크로소프트 아웃룩, 세일즈포스 등 주요 플랫폼을 위한 커넥터를 지원한다고 한다. 이에 따라 사용자는 자료 공유, 회의 참석, 파일 검색 업무 중 애플리케이션을 전환할 필요가 없게 되었다. 

사진 : 드롭박스(Dropbox)

드롭박스는 추후 생성 AI 또한 도입하여 저장된 자료를 기반으로 답변을 제공하거나 관련된 콘텐츠를 찾아주는 기능도 추가할 예정이라고 한다. 하나 아쉬운 점은 베타버전은 영어로만 제공된다는 점이다. 

반응형
SMALL

챗GPT, 알파고 이후 최대 임팩트

2022년 11월 30일에 공개된 ChatGPT는 5일만에 100만 사용자를 달성하였고, 40일만에 1000만, 2달만에 월 사용자 1억을 달성하였다. 틱톡(TikTok)이 9개월만에 달성했던 것에 비교하면 상당히 빠른 시일내에 많은 사용자를 달성했음을 알 수 있다.

챗GPT, 흥행 성공의 이유

  • 쉬운 사용 방법 : 누구나 쉽게 가입 가능하며, 기존 프롬프트 엔지니어링에서 필요했던 명령어에 대한 지식 없이 일반인도 누구나 질의 응답이 가능하다.
  • 자연스러운 답변 : 무엇보다도 질문에 대한 답변이 상당히 자연스럽다는 것이다. 여기서 자연스럽다는 것은 마치 인간과 대화를 하는 것처럼 느껴진다는 것이다.
  • 강력한 성능 : 광범위한 부분에서 굉장히 강력한 성능을 보인다. 논문을 작성해주기도 하며, 프로그래밍, 언어 변역 등 다양한 콘텐츠를 창의적인 방식으로 제작 가능하다.

챗GPT란?

그렇다면 ChatGPT란 도대체 무엇일까? 

챗봇 서비스를 의미하는 Chat과 Generative Pre-trained transformer라고 하는 언어 모델의 약자인 GPT를 이어붙인 합성어이다. 여기서 GPT는 OpenAI가 만든 대형언어모델(LLM, Large Language Model)이다. OpenAI는 일론 머스크 등이 인간 친화적 AI 개발을 목적으로 2015년 설립된 회사이다. OpenAI에서는 GPT 뿐만 아니라 Codex나 Dall-E 등을 개발하였다.

언어 처리 AI 기술의 발전

  • Transformer (2017) : 어텐션 모델, 병렬 학습에 유리
  • GPT-1 (2018) : 질문에 어울리는 답변 생성, 학습 파라미터 (1.17억개)
  • GPT-2 (2019) : 파라미터 (15억개), 다양한 스타일과 어조의 답변 생성
  • GPT-3 (2020) : 파라미터 (1750억개), 다양한 자연어 처리 가능
  • Codex (2021) : 파라미터 (60억), 프로그래밍 언어 중심
  • ChatGPT (2022.11.30) : 대화에 특화된 GPT 모델
  • GPT-4 (2023.3.14) 

ChatGPT의 학습

인공지능 모델에서 학습(training)은 빼놓을 수 없는 과정이다. 그렇다면 ChatGPT는 대체 어떠한 방식으로 학습시켰을까? 

ChatGPT의 training 과정은 크게 세 가지 단계(Pre-training, Fine-tuning, In-Context Learning)로 나눌 수 있다.

출처 :&nbsp;https://medium.com/@bijit211987/the-evolution-of-language-models-pre-training-fine-tuning-and-in-context-learning-b63d4c161e49

1. Pre-training(사전 훈련) 

이 단계에서는 대규모의 비지도 학습 데이터를 사용하여 모델을 사전 훈련한다. 이때의 학습 데이터는 책, 웹페이지, 논문 등의 다양한 데이터를 포함하고, 약 45TB(미국 의회 도서관 4.5배에 해당)의 대용량 데이터이다. 이러한 사전 훈련된 모델은 문장에서의 다음 단어를 예측하도록 최적화된다. 예를 들어, "나는 공원에 갔다"라는 문장이 주어졌을 때, 모델은 "나는 공원에" 다음에 올 단어로 "갔다"를 예측하도록 학습되는 것이다. 이 단계에서는 레이블이 없는 데이터를 사용(비지도 학습)하기 때문에 큰 규모의 데이터를 활용하여 모델이 언어의 패턴과 통계를 학습하도록 한다. 

2. Fine-tuning(미세 조정)

Pre-training 후에는 모델을 미세하게 조정하는 단계를 거친다. ChatGPT의 경우 프롬프트 샘플링과 40명이 작성한 정답을 기반으로 지도 학습을 진행한다. Fine-tuning은 보다 구체적인 작업에 맞게 모델을 특화시키는 데 도움이 된다.

3. In-context learning(문맥 학습)

마지막으로 GPT 모델은 대화식 환경에서 적합한 응답을 생성하기 위해서 추가적인 문맥 학습을 수행한다. 즉, 특정 사용자와의 대화 내에서 발생한 문맥을 사용하여 모델을 조정한다. 이를 통해 GPT 모델이 사용자의 질문이나 대화 히스토리에 따라 적합한 응답을 생성할 수 있도록 개선된다.

ChatGPT 학습에서 사람의 역할

흔히 인공지능이라고 하면 마치 사람의 개입이 전혀 없이 스스로 학습하는 것으로 생각된다. 하지만, ChatGPT 또한 사람, 전문가의 개입이 필수적이라고 할 수 있다.

ChatGPT 학습에서 사람의 개입

Reviewer Instructions(리뷰어 지침)은 GPT 모델의 Fine-tuning 단계에서 사용되는 데이터셋을 개발하기 위해 OpenAI employees (직원)이 작성한 지침이다. 이 지침은 리뷰어에게 어떤 종류의 데이터를 수집하고 어떤 방식으로 모델을 조정해야 하는지에 대한 가이드를 제공한다. 리뷰어들은 이 지침을 참고하여 Fine-tuning 데이터셋을 구성하고, 모델을 특정 작업에 맞게 조정하는 것이다. 

Fine-tuning 데이터셋은 리뷰어들이 조정 작업을 위해 사용하는 데이터입니다. 일반적으로, 이 데이터셋은 특정 작업에 관련된 문장 쌍이 포함되어 있다. 예를 들어, 질문 응답 작업을 위한 Fine-tuning 데이터셋에는 질문과 해당 질문에 대한 정답이 포함될 수 있는 것이다. 리뷰어들은 이 데이터셋을 사용하여 모델을 조정하고 성능을 향상시키는 역할을 한다. 

이처럼 GPT의 학습에는 전문가들과 리뷰어들이 개입하여 모델의 조정과 품질 평가에 참여하며, 이를 통해 모델의 성능을 개선하는데 기여한다.

프롬프트 엔지니어링

프롬프트 엔지니어링(Prompt Engineering)이란 자연어 처리 모델인 GPT와 같은 언어 모델을 사용할 때, 원하는 결과를 얻기 위하여 프롬프트를 설계하고 조정하는 기술을 말한다. GPT는 사용자가 제공한 프롬프트(명령어나 지시 사항)을 기반으로 문맥을 이해하고 답변을 생성하는데, 프롬프트 엔지니어링은 이 프로세스를 효율적으로 이끌기 위한 방법들을 연구하고 개발하는 것을 의미한다. 즉, ChatGPT와 제대로 대화하고 이해하기 위해서는 프롬프트 엔지니어링에 대한 이해가 필수적이다. 

ChatGPT와 제대로 대화하는 요령

그렇다면 ChatGPT와 제대로 대화하는 요령에 대해서 알아보자. 우선, ChatGPT에게 "ChatGPT와 제대로 대화할 수 있는 요령"을 물어보았다. 답변은 다음과 같았다.

위의 답변에 나오는 요령들도 모두 다 중요한 요령이다. 하지만, 내가 지금까지 ChatGPT를 사용해보면서 알아낸 좋은 답변을 위한 요령을 정리하면 다음과 같다.

1. 시작은 간결하고 뚜렷하게.

처음부터 너무 많은 것을 한꺼번에 해결하려고 하면 안 된다. 이것은 마치 사람에게 1시간짜리 강의를 쉴 틈 없이 하는 것과 마찬가지이다. 시작 질문은 질의응답의 목적이나 정의 등으로 시작하자.

2. 확장 가능한 질의.

ChatGPT는 위의 설명과 같이 In-context learning(문맥 학습)을 한다. 즉, 사람과 대화하듯 대화의 문맥과 질문의 방향성 등으로 학습을 진행하며 답변을 생성해낸다. 그렇기 때문에 유연하고 관련성 높은 답변을 위해서는 확장이 가능한 질문을 던지는 것이 좋다. 

3. 불필요한 정보 제거, 프롬프트 간소화.

사람도 나에게 불필요한 정보에는 관심이 없고, 혼란을 야기한다. ChatGPT도 마찬가지이다. 불필요한 단어, 모호한 단어, 이해할 수 없는 단어 등의 사용은 지양해야 한다. 

"Act as~" Hack

"Act as~" hack는 ChatGPT에게 특정 인물이나 캐릭터, 역할을 취하도록 지시하는 기술을 말한다. 이를 통하여 특정 역할을 수행하는 "척" 하도록 유도하여 더 구체적이고 일관된 답변을 얻을 수 있다.

아래 깃허브 링크에서 이 "Act as~" hack를 활용한 예시들을 확인할 수 있다.

 

GitHub - f/awesome-chatgpt-prompts: This repo includes ChatGPT prompt curation to use ChatGPT better.

This repo includes ChatGPT prompt curation to use ChatGPT better. - GitHub - f/awesome-chatgpt-prompts: This repo includes ChatGPT prompt curation to use ChatGPT better.

github.com

대표적인 예시 하나를 소개하면 다음과 같다.
 
Act as a Stand-up Comedian (스탠드업 코미디언으로서 행동하기)

"I want you to act as a stand-up comedian. I will provide you with some topics related to current events and you will use your wit, creativity, and observational skills to create a routine based on those topics. You should also be sure to incorporate personal anecdotes or experiences into the routine in order to make it more relatable and engaging for the audience. My first request is "I want an humorous take on politics."
  1. I want you to act as a stand-up comedian. : 앞으로 스탠드업 코미디언으로서 행동하도록 변경
  2. I will provide you with some topics related to current events and you will use your wit, creativity, and observational skills to create a routine based on those topics. : 사용자가 어떤 역할을 할 것인지 명시
  3. You should also be sure to incorporate personal anecdotes or experiences into the routine in order to make it more relatable and engaging for the audience. : 답변에 대한 추가적인 조건 제시
  4. My first request is "I want an humorous take on politics." : 첫 번째 요청 제시

 

반응형
SMALL

'인공지능 > NLP' 카테고리의 다른 글

[NLP] 간단하게 인공지능 챗봇 만들기  (8) 2023.06.29

본 포스팅에서는 OpenCV Python을 활용하여 얼굴 검출을 수행하는 방법을 소개합니다. 얼굴 검출은 컴퓨터 비전 분야에서 매우 중요한 작업 중 하나로, 이미지나 비디오에서 얼굴을 자동으로 인식하는 기술을 말합니다. 여기서는 하르 캐스케이드(Haar Cascade)라고 하는 객체 검출기를 사용하였고, 실행 환경은 Google Colab에서 실행하였습니다. 

1. OpenCV 설치하기

OpenCV가 설치되어 있지 않은 분들만 다음 코드를 콜랩에서 실행하여 설치해 주시면 됩니다.

!pip install opencv-python

2. Haar Cascade 파일 다운로드

얼굴 검출을 위해 미리 학습된 Haar Cascade 파일이 필요합니다. OpenCV 공식 GitHub 저장소에서 다양한 학습된 모델을 제공하고 있으며, 다음 링크로 들어가셔서 얼굴 검출에 사용할 "haarcascade_frontalface_default.xml" 파일을 다운로드해주시면 됩니다. 

https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml

 

GitHub - opencv/opencv: Open Source Computer Vision Library

Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.

github.com

3. OpenCV 라이브러리 임포트하기

준비 단계는 모두 마쳤고, 이제 본격적으로 얼굴 검출을 진행해보겠습니다. 우선, 다음 코드를 실행하여 OpenCV 라이브러리를 import 해줍니다.

import cv2

4. 구글 드라이브 마운트

구글 드라이브에 있는 파일을 사용하기 위해서 구글 드라이브를 마운트 해줍니다. 다음 코드를 실행만 해주시면 됩니다.

from google.colab import drive
drive.mount('/content/drive')

5. Haar Hascade 경로 설정해 주기

경로는 haarcascade_frontalface_default.xml 파일의 경로로 변경해 주시면 됩니다. 저는 드라이브에서 face 폴더 안에 이 파일을 넣어두었습니다.

# Haar Cascade 파일 경로
cascade_path = '/content/drive/MyDrive/face/haarcascade_frontalface_default.xml'

6. 이미지 읽기

다음으로 얼굴을 검출할 이미지를 불러옵니다. 저는 드라이브에 미리 저장해 두었던 방탄소년단 이미지를 불러왔습니다. 이미지의 형식은 jpeg, jpg 모두 상관없습니다. 

# 이미지 읽기
image_path = '/content/drive/MyDrive/face/bts.jpeg'
image = cv2.imread(image_path)

7. GrayScale로 변경

Haar Cascade는 GrayScale 이미지, 즉 흑백 이미지에서 얼굴을 검출하기 때문에 우리의 이미지 또한 흑백 이미지로 바꿔주어야 합니다. 다음 코드를 실행하시면 이미지를 GrayScale 이미지로 바꾸실 수 있습니다.

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

 

8. 얼굴 검출용 CascadeClassifier 객체 생성

CascadeClassifier 클래스의 인스턴스를 생성하여 얼굴 검출에 사용할 Haar Cascade 파일을 로드합니다.

face_cascade = cv2.CascadeClassifier(cascade_path)

9. 얼굴 검출

detectMultiScale 함수를 사용하여 얼굴을 검출합니다. 첫 번째 인자로는 그레이스케일 이미지를 전달하고, scaleFactor, minNeighbors, minSize와 같은 매개변수를 조정하여 얼굴 검출의 성능을 조절할 수 있습니다.

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

10. 검출된 얼굴 주변에 사각형 그리기

검출된 얼굴 주위에 사각형을 그려줍니다. 검출된 얼굴의 좌표와 너비, 높이를 사용하여 사각형의 좌표를 계산하고, 그립니다. 이 코드에서는 사각형의 색상을 (0, 255, 0)으로, 두께를 3으로 설정하였습니다.

for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 3)

11. 결과 이미지 출력

다음 코드로 얼굴에 사각형이 그려진 이미지를 출력해 볼 수 있습니다. 

from google.colab.patches import cv2_imshow
cv2_imshow(image)
cv2.waitKey(0)
cv2.destroyAllWindows()

전체 코드

import cv2
from google.colab.patches import cv2_imshow

# Haar Cascade 파일 경로
cascade_path = '/content/drive/MyDrive/face/haarcascade_frontalface_default.xml'

# 이미지 읽기
image_path = '/content/drive/MyDrive/face/bts.jpeg'
image = cv2.imread(image_path)

# 그레이스케일 변환
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 얼굴 검출용 CascadeClassifier 객체 생성
face_cascade = cv2.CascadeClassifier(cascade_path)

# 얼굴 검출
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 검출된 얼굴 주변에 사각형 그리기
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 3)

# 결과 이미지 출력
cv2_imshow(image)
cv2.waitKey(0)
cv2.destroyAllWindows()

결과 이미지

방탄소년단(bts) 이미지에서 멤버 얼굴 검출하기

하나만 하기에는 아쉬워서 걸그룹 아이브 얼굴도 검출해 보았다.

아이브 이미지에서 멤버 얼굴 검출하기


결론

살짝 정확도가 떨어지는 것 같기는 하지만, 단순 코드 몇 줄로 이렇게 얼굴을 검출할 수 있다는 것이 놀라웠다. 다음 글에서는 얼굴 검출뿐만 아니라 눈 검출이나 다른 것들도 시도해보려고 한다. 

반응형
SMALL

+ Recent posts