no image
[Docker] Dockerfile 명령어 모음집
Dockerfile에서 사용하는 명령어에 대해 정리한 글입니다. Overview 자주 사용하는 명령어 10가지입니다. 명령어 설명 FROM 이미지를 시작할 베이스 이미지 설정합니다. RUN 이미지를 빌드하는 동안 명령을 실행합니다. 패키지 설치나 설정 파일 수정 등의 작업에 사용됩니다. ENV 이미지의 환경변수를 설정하기 위해 사용됩니다. CMD 컨테이너가 시작될 때 실행할 기본 명령을 설정합니다. CMD는 Dockerfile에 한 번만 존재할 수 있습니다. EXPOSE 실제로 포트 공개하는 것이 아닌, 어떤 포트를 공개될 예정인지에 대한 정보를 제공합니다. COPY 로컬의 폴더 혹은 파일들을 컨테이너 이미지로 복사합니다. WORKDIR 작업 디렉토리를 변경합니다. ENTRYPOINT 추후 작성 예정 F..
2024.04.19
no image
[Gemini API] Gemini API를 이용해서 이미지 AutoLabling 하기
안녕하세요, 오늘은 Gemini API를 이용해서 이미지를 AutoLabling 하는 방법에 대해 소개해드리려고 합니다. 이미지와 예시를 제공하면, 그에 따른 이미지에 대한 설명을 제공하는데 이를 바탕으로 StableDiffusion Model을 Fine-tunning 할 수 있습니다. 순서는 다음과 같습니다. Gemini API Key 발급받기 이미지 입력 예시 작성하기 코드 작성하기 결과 확인하기 Gemini API Key 발급받기 여기를 누르고 프로젝트 설정을 하면, 다음과 같이 화면이 나오게 됩니다. Create API KEY 버튼을 누르고, Create API Key in exsting project 버튼을 누르면 API 키가 발급됩니다. 다음과 같이 API Key가 생성됩니다. Copy 버튼을..
2024.04.18
no image
[Python] Docstring에 대해 알아보자
안녕하세요, 오늘은 Python에서 사용하는 Docstring에 대해 설명해드릴려고 합니다. Docstring이란? Docstring은 Python에서 함수, 클래스, 모듈이나 메소드 등 첫 번째 줄에 위치하며, 코드의 목적이나 동작을 설명하는데 사용됩니다. 파이썬의 help함수를 이용해서 Docstring에 접근할 수 있으며, 코드의 이해를 돕고 다른 개발자들이 코드를 더 쉽게 사용할 수 있도록 합니다. 예시 >>> help(len) len(obj, /) Return the number of items in a container. Docstring 기본 구조 함수나 메소드의 Docstring: 함수의 작동 방식, 매개변수, 반환 값, 발생할 수 있는 예외 등을 설명합니다. 클래스의 Docstring: ..
2024.04.16
no image
[VSCode] ssh 비밀번호 무한 반복 입력 오류 해결
오류 다음과 같이 VSCode에서 ssh를 접속할 때, 비밀번호를 알맞게 입력해도 다음과 같은 화면이 계속 발생합니다. 이 때, 해결하는 방법에 대해 소개해드리려고 합니다. 해결방법 해결방법은 여러개가 있으니 1번부터 따라하면서 안되면 그 다음 순서대로 해보시면 해결되실겁니다.👍👍 Solution 1. .vscode-server 폴더 삭제 Server 내부의 .vscode-server 폴더를 삭제하는 것입니다. terminal 또는 cmd 창을 키고 다음과 같이 입력합니다. ssh User@HostName(IP) vscode-server 폴더를 삭제하는 커맨드를 입력합니다. rm -rf ~/.vscode-server 이후에 5분뒤 VSCode로 접속을 하시면 될 겁니다. Solution 2. .wget-..
2024.04.14
no image
[Docker] Container 내부에서 GPU 사용하는 방법
안녕하세요, 오늘은 Docker Container 내부에서 GPU를 간단하게 사용할 수 있는 방법에 대해 소개하려고 합니다. 총 2가지를 진행하면 됩니다. 간단하게 nvidia-docker 설치와 같은 방법을 사용하지 않고 진행합니다. Dockerfile 환경변수 추가 설정 Docker Container 실행시 매개변수 추가 Dockerfile 환경변수 추가 설정 # Dockerfile FROM python:3.8 ADD . /workdir RUN apt-get update && apt-get install vim -y RUN pip install torch && pip install transformers && pip install gpustat ##### 다음 줄 추가 ##### ENV CUDA_VI..
2024.04.10
no image
[Docker] Docker와 Google Cloud를 이용해 Flask Web서버 배포하기
안녕하세요, 오늘은 Docker와 Google Colud Console을 이용해서 Flask로 만든 Web을 배포해보겠습니다. 업로드 할 것은 다음과 같이 진행할 예정입니다. Google Cloud 기본 설정 VM instance 생성 Docker설치, app.py 생성 및 설정 Dockerfile 생성, 빌드 및 Container 생성 방화벽 설정 완성 Google Cloud 기본 설정 https://cloud.google.com/ 클라우드 컴퓨팅 서비스 | Google Cloud 데이터 관리, 하이브리드 및 멀티 클라우드, AI와 머신러닝 등 Google의 클라우드 컴퓨팅 서비스로 비즈니스 당면 과제를 해결하세요. cloud.google.com VM instance를 생성하기 전 위의 링크로 들어가서..
2024.04.07
no image
[Paper Review] Efficient Computation of Rankings from Pairwise Comparisons
논문링크 https://jmlr.org/papers/volume24/22-1086/22-1086.pdf 다음 논문은 Bradly-Terry Model을 이용해서 Pairwise comparisons를 통해 여러 Class 간의 순위를 매기는 것을 이용해 우선순위를 최대 우도 추정법을 이용하여 빠르게 수렴시키는 방법에 대한 논문이며, 이에 대해 리뷰하려고 한다. 수식유도에 대해 설명을 하고 증명은 생략한다. Introduction 우리는 각 개인 $ i $에게 수치 점수 $ \pi_i $를 할당하고 $ i $가 $ j $를 이길 확률 $p_{ij}$로 가정하며, 가장 인기 있는 Logistic function을 사용한다(확률로 표현하기 좋은 함수). $p_{ij}$를 다음과 같이 사용한다. 여기서 $\pi..
2024.04.03
no image
[Metric Review] CIDEr Metric 분석
논문링크 https://arxiv.org/pdf/1411.5726.pdf Introduction 논문이 나온 시점에서 이미지에 설명하는 문제에 대해 이미지를 인간과 같은 방식으로 설명을 생성하는 관심이 생기고 있었다. 그 와 관련하여 Automatic evalution으로 Sentence evalution은 아직 어려운 분야였다. 논문 이전의 Automatic evalution matric은 Precision 기반의 BLEU와 Recall 기반의 ROUGE가 있었다. 하지만 이러한 Metric은 Human evalution과 Automatic evalution의 Pearson correlation가 낮다고 표시된다. 이후 METEOR가 나오면서, 더 나은 Correlation을 보여주고 있지만 이미지 설..
2024.04.01
no image
[Metric Review] BLEU Metric 분석
논문링크 https://aclanthology.org/P02-1040.pdf Introduction Machin Translation(MT)에 대해 사람의 평가는 광범위하며 비용이 많이 발생한다. 심지어 사람이 MT의 성능을 파악하는데 몇 달이 걸릴 수 있으며 매우 큰 비용의 노동력을 필요로 한다. 그래서 저자는 다음과 같은 특징을 가진 automatic machine translation evaluation 방법을 제안한다. Quick Inexpensive Language-independent that correlates highly with human evaluation Little marginal cost per run 다음과 같은 특징을 통해 BLEU Metric이 Human Evaluation을..
2024.03.31
no image
[Metric review] METEOR Metric 분석
논문 링크 https://aclanthology.org/W05-0909.pdf Introduction 논문이 써질 시점을 기준으로 Machin Translation(MT) 평가에 대해 Automatic Metric이 상당한 주목을 받게 되었다. 그 이유는 MT System에 대해 Metric을 사용하여 Evalution 하는 것이 두 개 국어를 할 줄 아는 사람이 Evaluation을 하는 것보다 훨씬 바르고 쉽고 저렴하기에 MT Metric에 대해 관심이 높아졌다. 하지만 여러 수식이 MT Evalution Metric이 되는 것은 아니다. 다음은 Metric에 대한 조건이다. Metric의 조건 인간의 평가와 매우 높은 상관관계를 가져야 함 MT 품질에 대해 민감해야 함 Consistent (비슷한 ..
2024.03.29
728x90

Dockerfile에서 사용하는 명령어에 대해 정리한 글입니다. 

Overview


자주 사용하는 명령어 10가지입니다.

명령어 설명
FROM  이미지를 시작할 베이스 이미지 설정합니다.
RUN  이미지를 빌드하는 동안 명령을 실행합니다. 패키지 설치나 설정 파일 수정 등의 작업에 사용됩니다.
ENV  이미지의 환경변수를 설정하기 위해 사용됩니다.
CMD 컨테이너가 시작될 때 실행할 기본 명령을 설정합니다. CMD는 Dockerfile에 한 번만 존재할 수 있습니다.
EXPOSE 실제로 포트 공개하는 것이 아닌, 어떤 포트를 공개될 예정인지에 대한 정보를 제공합니다.
COPY 로컬의 폴더 혹은 파일들을 컨테이너 이미지로 복사합니다. 
WORKDIR 작업 디렉토리를 변경합니다.
ENTRYPOINT 추후 작성 예정

 

Format


# Comment
INTROUCTION arguments

INTRODUCTION은 대문자를 구분하지 않지만, 일반적으로 인수와 쉽게 구별하기 위해 대문자로 작성하는 것이 관례입니다.

 

FROM


FROM 지시문은 새로운 빌드 단계를 초기화하고 이후 지시문에 대한 베이스 이미지를 설정합니다. 이미지는 유효한 이미지라면 어떤 것이든 사용할 수 있습니다.

FROM [--platform=<platform>] <image> [AS <name>]

## 예시
FROM python:3.12

다음 Dockerfile은  Python 3.12이미지를 빌드합니다.

ARG와 FROM를 이용해서 사용하기

ARG  CODE_VERSION=latest
FROM python:${CODE_VERSION}

다음과 같이 작성해서 파이썬을 계속 최근 버전을 사용할 수 있도록 합니다.

 

RUN


RUN 지시문은 현재 이미지 위에 새로운 레이어를 생성하기 위해 명령을 실행합니다. 추가된 레이어는 Dockerfile의 다음 단계에서 사용됩니다. RUN은 두 가지 형태가 있습니다.

# Shell form:
RUN [OPTIONS] <command> ...
# Exec form:
RUN [OPTIONS] [ "<command>", ... ]

 

명령어를 여러 개를 사용할 때 다음과 같이 작성할 수 있습니다.

RUN <<EOF
apt-get update
apt-get install -y curl
EOF

## 또는

RUN apt-get update && apt-get install -y curl

 

ENV


ENV 지시문은 환경 변수 <key><value> 값으로 설정합니다. 이 값은 빌드 단계의 모든 이후 지시문에서 환경에 포함되며, 많은 경우에 인라인으로 대체될 수도 있습니다. 값은 다른 환경 변수들을 위해 해석되므로, 이스케이프 처리되지 않은 경우 인용 부호는 제거됩니다.

ENV <key>=<value>

사용 예시는 다음과 같습니다.

ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog

 

CMD


CMD 명령은 이미지에서 컨테이너를 실행할 때 실행할 명령을 설정합니다.

사용 방법은 다음과 같이 2가지가 있습니다.

## exec form
CMD ["executable","param1","param2"] (exec form)

## shell form
CMD command param1 param2 (shell form)

 

EXPOSE


Dockerfile 안에서 사용되며, 해당 Docker 이미지가 컨테이너 내에서 특정 프로토콜을 사용하여 특정 포트에서 리스닝하고 있음을 문서화합니다. 이 지시문은 컨테이너의 메타데이터에 정보만 추가할 뿐, 실제 포트를 외부에 공개하지 않습니다.

EXPOSE <port> [<port>/<protocol>...]

사용 예시는 다음과 같습니다.

EXPOSE 80/udp

Docker 이미지가 컨테이너 내에서 TCP 프로토콜을 사용하여 80번 포트에서 리스닝을 할 것을 암시합니다.

 

마지막으로 도커에서 포트를 열어주어야만 가능합니다.

docker run -p 80:80/tcp

 

COPY


로컬의 폴더 혹은 파일들을 컨테이너 이미지로 복사합니다. 

COPY [원본경로] [컨테이너 경로]

사용 예시는 다음과 같습니다.

COPY . /src

 

 

WORKDIR


WORKDIR 지시문은 그 이후에 오는 Dockerfile의 RUN, CMD, ENTRYPOINT, COPY, ADD 지시문에 대한 작업 디렉토리를 설정합니다. 만약 WORKDIR이 존재하지 않는다면, 이후의 Dockerfile 지시문에서 사용되지 않더라도 생성됩니다.

WORKDIR directory

 

여러번 사용할 수 있습니다. 상대 경로가 제공되면, 이전 WORKDIR 지시문의 상대 경로로 적용됩니다.

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

다음과 같이 pwd 명령어 실행시 디렉토리는 /a/b/c 입니다.

 

ENTRYPOINT


추후 작성 예정

 

 

 

출처 : https://docs.docker.com/reference/dockerfile/

728x90
728x90

안녕하세요, 오늘은 Gemini API를 이용해서 이미지를 AutoLabling 하는 방법에 대해 소개해드리려고 합니다. 이미지와 예시를 제공하면, 그에 따른 이미지에 대한 설명을 제공하는데 이를 바탕으로 StableDiffusion Model을 Fine-tunning 할 수 있습니다.  순서는 다음과 같습니다.

  1. Gemini API Key 발급받기
  2. 이미지 입력 예시 작성하기
  3. 코드 작성하기
  4. 결과 확인하기

 

Gemini API Key 발급받기


여기를 누르고 프로젝트 설정을 하면, 다음과 같이 화면이 나오게 됩니다. Create API KEY 버튼을 누르고, Create API Key in exsting project 버튼을 누르면 API 키가 발급됩니다.

 

 

다음과 같이 API Key가 생성됩니다. Copy 버튼을 누르거나, 메모장에 미리 저장합니다.

 

이미지 입력 예시 작성하기


Stable Diffusion 예시등을 예시로 제공해 주면서, AutoLabeling의 Example을 제공해 줍니다. 이번에 저는 Dreambooth method를 사용하여 사자를 잘 생성하고 싶어서 다음과 같은 예시를 제공했습니다. Lion을 TOK라고 바꾸어서 AutoLabeling을 진행하려고 합니다.  그래서 Input Text는 다음과 같이 설정했습니다.

INPUT_TEXT = '''
I want to train a text-to-image Stable Diffusion model with dreambooth method. Please generate an appropriate text prompt for this image. This cartoon character's names is "TOK". You don't have to describe the character's appearance. Instead, Focus on the image style, character's action, clothing, other objects, and background.
[Examples]
* Simplified illustration of TOK cartoon character, one TOK, wearing a blue business suit with red tie and gold INU pin, holding a brown briefcase, on a black background with blue waterdrop shapes and gold stars.
* 3D Image of TOK cartoon character, one TOK, wielding a spatula with wooden handle in a light blue chef's jacket with darker blue trim and matching tall chef's hat, dark navy blue background.

'''

영어로 작성하는 것이 한국어로 작성하는 것보다 성능이 좋게 나오므로 영어로 설정해주었습니다.

 

코드 작성하기


Gemini API를 사용하기 위해서 SDK를 설치합니다.

pip install -q -U google-generativeai

이미지를 입력으로 넣기 위해 pillow(PIL)을 설치합니다.

pip install pillow

 

그리고 다음과 같이 image와 text를 입력하면 출력 결과가 나옵니다.

import google.generativeai as genai
import PIL.Image, local

## gemini
text = "describe this image"
api_key = "api_key"

genai.configure(api_key=api_key)
file_path = f'C:\\User\\1.png'
img = PIL.Image.open(file_path)
model = genai.GenerativeModel('gemini-pro-vision')
response = model.generate_content([text,img])

print(response.text)

다음과 같이 발급받은 api_key와 file_path를 입력하고 실행하면 됩니다.

 

 

결과 확인하기


다음은 코드를 실행하고 나온 출력결과입니다. 맨 밑에 출력결과가 나온 것을 확인할 수 있습니다.

이와 같이 Gemini API를 이용해서 image를 AutoLabeling을 할 수 있습니다. 

728x90
728x90

안녕하세요, 오늘은 Python에서 사용하는 Docstring에 대해 설명해드릴려고 합니다. 

Docstring이란?


Docstring은 Python에서 함수, 클래스, 모듈이나 메소드 등 첫 번째 줄에 위치하며, 코드의 목적이나 동작을 설명하는데 사용됩니다. 파이썬의 help함수를 이용해서 Docstring에 접근할 수 있으며, 코드의 이해를 돕고 다른 개발자들이 코드를 더 쉽게 사용할 수 있도록 합니다.

예시

>>> help(len)                                                                                                                

len(obj, /)
    Return the number of items in a container.

 

Docstring 기본 구조


  • 함수나 메소드의 Docstring: 함수의 작동 방식, 매개변수, 반환 값, 발생할 수 있는 예외 등을 설명합니다.
  • 클래스의 Docstring: 클래스의 목적과 행동을 설명하고, 주요 메소드에 대한 간단한 요약을 포함할 수 있습니다.
  • 모듈의 Docstring: 모듈의 콘텐츠와 모듈이 제공하는 주요 클래스와 함수를 개략적으로 설명합니다.

 

Docstring 사용 예시


작성은 Module 첫번째 줄, 선언 후 바로 아랫줄에 작은따옴표 3개 또는 큰 따옴표 3개를 이용해서 작성합니다.

간단한 add 함수를 이용해서 사용해보겠습니다.

def add(a, b):
    """
    두 수의 합을 반환합니다.

    매개변수:
        a (int): 첫 번째 숫자.
        b (int): 두 번째 숫자.

    반환값:
        int: a와 b의 합.

    예외:
        TypeError: 입력된 매개변수가 정수가 아닐 때 발생.

    사용 예:
        >>> add(2, 3)
        5
    """
    return a + b
  • help 함수를 사용하기
  • __doc__ 속성 사용하기

2가지를 이용해 실행해보겠습니다.

실행결과 1

>>> help(add)
Help on function add in module __main__:

add(a, b)
    두 수의 합을 반환합니다.

    매개변수:
        a (int): 첫 번째 숫자.
        b (int): 두 번째 숫자.

    반환값:
        int: a와 b의 합.
                                                                                                                                                                
    예외:
        TypeError: 입력된 매개변수가 정수가 아닐 때 발생.

    사용 예:
        >>> add(2, 3)
        5

실행결과 2

>>> add.__doc__
'\n    두 수의 합을 반환합니다.\n\n    매개변수:\n        a (int): 첫 번째 숫자.\n        b (int): 두 번째 숫자.\n\n    반환값:\n        int: a와 b의 합.\n\n    예외:\n        TypeError: 입력된 매개변수가 정수가 아닐 때 발생.\n\n    사용 예:\n        >>> add(2, 3)\n        5\n    '

다음과 같이 함수에 대한 설명이 실행결과로 나옵니다.

 

결론


docstring을 이용해 다음과 같이 함수의 설명, 매개변수 설명과 사용 예시를 설명할 수 있습니다. 

 

728x90
728x90

오류


다음과 같이 VSCode에서 ssh를 접속할 때, 비밀번호를 알맞게 입력해도 다음과 같은 화면이 계속 발생합니다. 이 때, 해결하는 방법에 대해 소개해드리려고 합니다.

 

해결방법


해결방법은 여러개가 있으니 1번부터 따라하면서 안되면 그 다음 순서대로 해보시면 해결되실겁니다.👍👍

 

Solution 1. .vscode-server 폴더 삭제

Server 내부의 .vscode-server 폴더를 삭제하는 것입니다.

  1. terminal 또는 cmd 창을 키고 다음과 같이 입력합니다.
ssh User@HostName(IP)
  1. vscode-server 폴더를 삭제하는 커맨드를 입력합니다.
rm -rf ~/.vscode-server

이후에 5분뒤 VSCode로 접속을 하시면 될 겁니다.

Solution 2. .wget-hsts 폴더 삭제

Server 내부의 .wget-hsts와 .vscode-server 폴더를 같이 삭제하는 것입니다.

  1. terminal 또는 cmd 창을 키고 다음과 같이 입력합니다.
ssh User@HostName(IP)
  1. vscode-server와 wget-hsts를 삭제하는 커맨드를 입력합니다.
rm -rf ~/.vscode-server
rm -rf ~/.wget-hsts

 

Solution 3. 프로세스 삭제

wget에서 오류가 뜨는 것일 수 있습니다. 그래서 이와 관련된 vscode 프로세스를 삭제하는 것입니다.

  1. terminal 또는 cmd 창을 키고 다음과 같이 입력합니다.
ssh User@HostName(IP)
  1. vscode 관련 process 들을 검색합니다.
ps -ax | grep "vscode"
  1. 검색된 프로세스들을 모두 종료합니다.(가장 앞에 써져 있는 숫자가 프로세스 ID입니다.)
kill -9 [PID]

 

Solution 4. known_hosts 및 known_hosts.old 파일 삭제

known_hosts 및 known_hosts.old 관련한 파일들이 문제를 일으킬 수 있습니다. 그래서 이와 관련한 파일들을 삭제해주어야 합니다.

하나만 있다면, 하나만 삭제해도 되며, config는 삭제할 필요가 없습니다.

Window 기준
C:\Users\유저명.ssh
위의 파일 경로로 가게 된다면, config 파일과 known_hosts 및 known_hosts.old 파일이 있습니다. 두 파일을 삭제하고 ssh에 접속하면 해결됩니다.

Mac 기준
Terminal에 접속합니다.

cd ~/.ssh
rm -rf known_hosts
rm -rf known_hosts.old

Solution 5. Remote-SSH 버전 낮추기

Remote-SSH의 Extention 버전이 호환이 되지 않아서 생기는 문제입니다. Remote-SSH의 버전을 낮추면 됩니다. 방법은 다음과 같습니다

 

다음과 같은 화면에서 표시한 곳을 눌러서 현재 버전보다 낮은 버전을 설치하고 Reload Window 버튼을 누르고 ssh 접속을 하면 해결됩니다.

 

Solution 6. VScode 버전 낮추기 및 자동 업데이트 끄기

Solution 5까지 해결되지 않았다면, 마지막으로 VSCode Version 문제입니다.

https://code.visualstudio.com/updates/v1_88

위의 링크로 접속해서 현재 버전보다 1개 또는 2개 낮은 버전을 설치합니다.

 

저는 1.88버전까지 나와있었으며, 그보다 버전이 2단계 낮은 1.86 버전을 설치했습니다. 그림과 같이 왼쪽의 탭에서 선택후 컴퓨터에 맞는 운영체제를 설치합니다.

여기서 가장 중요한것이 자동 업데이트를 꺼야합니다.

끄는 방법에 대해 소개해드리겠습니다.

다음과 같이 File → Preferences → Settings 또는 Ctrl + , 를 누릅니다.

 

위에서 Update를 입력하고 밑에 있는 Update: Mode 에서 none으로 설정하고 재부팅 버튼이 나타나면, 재부팅을 합니다.

그리고 SSH에 접속을 하면, 해결됩니다.

 

결론


서버와 VSCode의 버전문제, Remote SSH의 버전문제로 인해서 3일 동안 고생했습니다. 이 글을 보고 잘 해결되었으면 좋겠습니다. 감사합니다 :)

728x90

'Program > VSCode' 카테고리의 다른 글

[VSCode] csv파일 한글깨짐 해결방법  (0) 2024.06.14
728x90

안녕하세요, 오늘은 Docker Container 내부에서 GPU를 간단하게 사용할 수 있는 방법에 대해 소개하려고 합니다.

Docker Container에서 cuda가 실행되지 않는 모습

총 2가지를 진행하면 됩니다. 간단하게 nvidia-docker 설치와 같은 방법을 사용하지 않고 진행합니다.

  1. Dockerfile 환경변수 추가 설정
  2. Docker Container 실행시 매개변수 추가

 

 

Dockerfile 환경변수 추가 설정


# Dockerfile 

FROM python:3.8

ADD . /workdir

RUN apt-get update && apt-get install vim -y
RUN pip install torch && pip install transformers && pip install gpustat

##### 다음 줄 추가 #####
ENV CUDA_VISIBLE_DEVICES=0
##### 추가 #####

ENV CUDA_VISIBLE_DEVICES=0

 

다음과 같이 환경변수를 설정합니다.

 

Docker Container 실행시 매개변수 추가


위의 Dockerfile을 빌드합니다.(docker build -t <이미지 이름> <Dockerfile위치>)

 

# Container 생성
>>> docker run -dt --name test --gpus all image:latest

# Container 접속
>>> docker exec -it <container id> /bin/bash

여기서 컨테이너를 생성시 --gpus all 다음과 같은 매개변수를 추가합니다.

다음과 같이 GPU를 사용할 수 있게 됩니다. 

간단하게 로컬 GPU를 사용할 수 있도록 Docker image build 및 Container 생성에 대해 알아봤습니다.

728x90
728x90

안녕하세요, 오늘은 Docker와 Google Colud Console을 이용해서 Flask로 만든 Web을 배포해보겠습니다. 업로드 할 것은 다음과 같이 진행할 예정입니다.

  1. Google Cloud 기본 설정
  2. VM instance 생성
  3. Docker설치, app.py 생성 및 설정
  4. Dockerfile 생성, 빌드 및 Container 생성
  5. 방화벽 설정
  6. 완성

 

Google Cloud 기본 설정


https://cloud.google.com/

 

클라우드 컴퓨팅 서비스 | Google Cloud

데이터 관리, 하이브리드 및 멀티 클라우드, AI와 머신러닝 등 Google의 클라우드 컴퓨팅 서비스로 비즈니스 당면 과제를 해결하세요.

cloud.google.com

VM instance를 생성하기 전 위의 링크로 들어가서 카드를 등록해야합니다.

https://console.cloud.google.com/?hl=ko

카드를 등록하면, 다음과 같이 무료 체험판 사용을 위해 300$을 제공해줍니다. 그리고 좌하단에 VM 만들기로 들어갑니다.

https://console.cloud.google.com/marketplace/product/google/compute.googleapis.com

Compute Engine API를 사용 누릅니다. (1~2분 소요)

 

Google Cloud VM instance 생성


https://console.cloud.google.com/compute/instances?hl=ko

다음 사이트에 접속을 하면 위의 사진과 같이 나오면서 인스턴스 만들기를 누릅니다

 

이름은 test-1로 바꾸고, 지역은 서울로 지정했습니다. 

액세스 범위에 대해서는 다음과 같이 설정했으며, 방화벽은 HTTP와 HTTPS 트래픽 허용을 체크하고 만들기 버튼을 눌렀습니다. (만들기 버튼 누르고 VM instance 생성까지 1 ~ 2분 소요)

다음과 같이 인스턴스가 만들어진 것을 볼 수 있습니다.

 

Docker설치, app.py 생성 및 설정


SSH 옆에 화살표 버튼을 눌러서 브라우저 창에서 열기 클릭

브라우저 창에서 열기를 통해서 인스턴스를 실행합니다.

 

다음과 같이 창이 나타나면서 이제부터 명령어를 실행합니다.

 

# docker 설치
sudo apt install docker.io -y

# app.py 생성
touch app.py

# app.py 수정
vi app.py

app.py 파일을 수정합니다.

# app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
	return "Hello, Flask"
    
if __name__ == "__main__":
	app.run()

마지막으로 ESC 버튼을 누르고 :wq Enter 누르고 파일을 저장하고 나갑니다.

 

Docker 파일 생성 및 설정


Dockerfile 생성 및 수정

# Dockerfile 생성
touch Dockerfile

# Dockerfile 수정
vi Dockerfile

 

Dockerfile 파일 내용

FROM python:3.12

ADD . /app

RUN pip install flask

CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]

i 버튼을 눌러서 Insert Mode로 설정한 뒤, 다음과 같은 Text를 입력한 뒤, :wq를 눌러서 저장하고 나갑니다.

 

Docker 파일 빌드 및 컨테이너 생성


명령어를 통해 생성한 Dockerfile을 빌드하고 컨테이너를 생성합니다.

# 현재 디렉토리에 있는 Dockerfile을 이용해 이름이 test인 이미지 빌드
sudo docker build -t test .

# 빌드된 이미지(test)를 이용해 아룸아 test1이라는 컨테이너 생성 및 5000포트를 이용하여 접속
sudo docker run --name=test1 -d -t -p 5000:5000 test

 

Conatiner ID 확인

# 현재 실행중인 Container 확인
sudo docker ps

다음과 같이 Container ID와 여러 정보를 알 수 있습니다.

 

Conatiner에서 Flask가 잘 실행되었는지 확인하기 위해 로그를 확인합니다.(logs 뒤에 Container ID의 앞자리만 입력하면 됨)

sudo docker logs 829

다음과 같이 실행이 잘 되고있는 것을 확인할 수 있습니다.

 

외부 IP와 5000 포트를 결합하여 입력창에 입력합니다. (여기서 https 가 아닌 http를 이용해서 접속해야 합니다.)

 

하지만 다음과 같이 무한로딩에 걸리면서 접속이 되지 않는데, 이 때 방화벽을 설정해주어야 합니다.

 

 

방화벽 설정


https://console.cloud.google.com/net-security/firewall-manager/firewall-policies/list?hl=ko

방화벽에 접근하는 방법

  1. 좌상단에 메뉴버튼 클릭
  2. VPC 네트워크 화살표 클릭
  3. 그 안에 있는 방화벽 메뉴 클릭

접근이 어려운 분들은 사진 밑에 링크 달아놨습니다.

 

상단에 있는 방화벽 규칙 만들기를 누릅니다.

 

다음과 같이 설정합니다.

  • 대상 : 네트워크의 모든 인스턴스
  • 소스 IPv4 범위 : 0.0.0.0/0
  • 프로토콜 및 포트 : 모두 허용

만들기 버튼을 눌러서 방화벽 규칙을 만듭니다.

다음과 같이 test2 방화벽이 만들어진 것을 확인할 수 있습니다.

 

 

완성


방화벽 생성 이후 다음과 같이 웹사이트에 접근할 수 있습니다.

 

이상입니다!

 

728x90
728x90
논문링크
https://jmlr.org/papers/volume24/22-1086/22-1086.pdf

 

다음 논문은 Bradly-Terry Model을 이용해서 Pairwise comparisons를 통해 여러 Class 간의 순위를 매기는 것을 이용해 우선순위를 최대 우도 추정법을 이용하여 빠르게 수렴시키는 방법에 대한 논문이며, 이에 대해 리뷰하려고 한다.

수식유도에 대해 설명을 하고 증명은 생략한다.

 

Introduction


우리는 각 개인 $ i $에게 수치 점수 $ \pi_i $를 할당하고 $ i $가 $ j $를 이길 확률 $p_{ij}$로 가정하며, 가장 인기 있는 Logistic function을 사용한다(확률로 표현하기 좋은 함수). $p_{ij}$를 다음과 같이 사용한다.  여기서 $\pi_i$는 $i$의 Strength라고 부른다.

$$ p_{ij} = \frac{\pi_i}{\pi_i+\pi_j} $$

N개의 팀 사이의 Pairwise competitions의 결과가 주어진다면, 결과를 바탕으로 Strength를 직접 계산할 수 있다. 일반적으로 최대 우도 추정(Maximum Likelihood Estimation, MLE)을 사용한다. $ w_{ij} $를 $ i $가 $ j $를 이긴 총횟수로 정의하거나, $ i $와 $ j $가 경쟁한 적이 없으면 0으로 정의한다. Strength의 최대 우도 값은 다음 방정식으로 수렴할 때까지 반복한다.

다음에 나오는 방정식 Zermelo에 의해 소개되고 Bradley와 Terry에 의해 다시 바뀐 Bradley-Terry Model이다.

$$ \pi^\prime_i = \frac{\sum^N_{j=1}w_{ij}}{\sum^N_{j=1}(w_{ij}+w_{ji})/(\pi_i+\pi_j)} $$

다음 방정식(Zermelo)은 수렴에 도달할 때까지 반복하며, 이 방정식은 수렴하는데 느리다고 알려져 있다. 이 논문에서는 다음 방정식 대신 빠르게 수렴하는 방법에 대한 연구를 진행한다. 

$$ \pi^\prime_i = \frac{\sum^N_{j=1}w_{ij}\pi_j/(\pi_i+\pi_j)} {\sum^N_{j=1}w_{ji}/(\pi_i+\pi_j)} $$

이 방정식은 이전의 수식보다 빠르게 수렴하는 것을 보여주며, 특별한 케이스에는 100배 이상 빠르다. 이 방정식 또한 Zermelo의 방정식과 같이 구현하기 쉽다.

이후 논문에서는 Zermelo의 원래 알고리즘과 제안된 알고리즘에 대해 설명하고 유도한다. 다음은 두 알고리즘이 수렴한다는 것을 증명하며, 수렴속도를 비교한다. 하지만, 증명에 대한 내용은 수식이 많으므로 생략한다.

 

Iterative Algorithms and the Bradley-Terry Model


이번 섹션에서는 이전에 제시되었던 Zermelo Algorithm과 논문에서 제시하는 알고리즘에 대해 유도하는 과정에 대해 설명한다. 여기서는 무승부에 대해 허용하지 않는다. 각 변수에 대한 설명은 다음과 같다. 선수 $ i $가 선수 $ j $를 이길 확률을 $ p_{ij} $라고 하며, 선수 $ i $의 능력을 $ \pi_i $라고 하며, 더 높은 값이 더 나은 선수이다.

승리 확률 $ p_{ij} $는 모든 $ \pi_i $를 임의의 상수로 곱해도 변하지 않는 것을 알아야 한다. (확률은 상대적이기에 똑같이 상수를 곱해도 상대적으로 동일하기 때문이다.) 그래서 논문에서는 기하 평균을 1이 되도록 고정하며 이는 $ \prod_i\pi_i = 1 $로 설정하는 것과 동일하다. 

 

Zermelo's Algorithm

토너먼트가 팀 간 총 $ M $ 게임으로 구성한다고 가정하고  선수 $ i $가 선수 $ j $를 이긴 횟수를 $ w_{ij} $라고 한다. 이 데이터를 바탕으로 Strength $ \pi_i $의 최대 우도 추정(MLE)이 가능하다. 일단 우도를 구하는 방정식으로부터 최대 우도 추정을 구하는 식을 유도한다.(각각 행렬 W = $[w_{ij}]$, 벡터 $ \pi $ = $ [\pi_i] $를 의미한다.)

관측된 게임의 우도는 다음과 같다.

$$ P(W|\pi) =\Pi_{ij}p_{ij}^{w_{ij}} =\Pi_{ij}(\frac{\pi_i}{\pi_i+\pi_j})^{w_{ij}} $$

따라서 $ \text {log} $우도는 다음과 같다.

$$ \text {log}P(W|\pi) = \sum_{ij}w_{ij}\text{log}\frac{\pi_i}{\pi_i+\pi_j} = \sum_{ij}w_{ij}\text{log}\pi_i-\sum_{ij}w_{ij}\text{log}(\pi_i+\pi_j).  $$

$ \pi_i $에 대해 미분하고 결과를 0으로 설정하면 다음을 얻는다. 

여기서 미분을 하고 $ \pi_i $에 대해 미분하는 이유는 $ \pi_i $에 대한 극값을 찾으면 그 값이 $ \pi_i $가 최대를 갖는 값이며, 최대 우도값이 된다.

$$  \frac{1}{\pi_i}\sum_jw_{ij}-\sum_j\frac{w_{ij}+w_{ji}}{\pi_i+\pi_j}=0  $$

이는 다음과 같이 재배열될 수 있다.

$$ \pi_i = \frac{\sum_jw_{ij}}{\sum_j(w_{ij}+w_{ji})/(\pi_i+\pi_j)}. $$

이 방정식은 닫힌 형태의 해를 갖지 않는다(방정식으로 정확한 해를 찾을 수 없음). 하지만 반복을 통해 수치를 수렴할 수 있다. $\pi_i $에 대해 음수가 아닌 값(랜덤 값)을 선택하고 그리도 다음과 같은 새로운 값 $ \pi^\prime_i $를 계산한다.

$$ \pi^\prime_i = \frac{\sum_jw_{ij}}{\sum_j(w_{ij}+w_{ji})/(\pi_i+\pi_j)}. $$ 

이 과정을 반복하면, $ \text {log} $우도의 최댓값으로 수렴한다. 따라서 Strength $ \pi_i $에 대해 추정치를 얻을 수 있으며 이 값을 정렬하여 선수들의 순위를 매기거나 평가할 수 있게 된다.

 

An Alternative Algorithm

Bradley-Terry 모델에 대해 최대 우도 추정치(MLE)를 계산하는 것은 단순한 문제이지만, 속도가 느리므로 이에 대해 빠른 알고리즘을 찾기 위해 노력해 왔다. 이 중 일부는 복잡하지만, 논문에서는 매우 효율적인 접근 방식을 제안한다.

$$ \frac{1}{\pi_i}\sum_jw_{ij}-\sum_j\frac{w_{ij}+w_{ji}}{\pi_i+\pi_j}=0 $$

위의 식을 다르게 그룹화하면 다음과 같이 작성할 수 있다.

$$ \frac{1}{\pi_i}\sum_jw_{ij}\frac{\pi_j}{\pi_i+\pi_j} - \sum_j\frac{w_{ji}}{\pi_i+\pi_j} = 0, $$

다시 배열하면

$$ \pi^\prime_i = \frac{\sum_jw_{ij}\pi_j/(\pi_i+\pi_j)}{\sum_jw_{ji}/(\pi_i+\pi_j)} $$

이는 Bradley-Terry 모델에 대한 다른 반복 알고리즘을 제안한다. 다시 적절한 시작 값(랜덤 값)을 선택한다, 그리고 우리는 수렴할 때까지 다음 형태를 반복한다.

이 알고리즘을 통해 이전에 제시한 Zermelo 알고리즘보다 "매우" 빠르게 최대 우도에 수렴하는 것이다. 

 

Conclusion


$ \alpha $의 값에 따라 알고리즘이 정해진다.

다음은 논문에서 제시하는 반복 알고리즘의 일반식이고 $\alpha $가 1이면 Zermelo알고리즘이며 $ \alpha $가 0이면 논문에서 제시하는 알고리즘이다.

$ \alpha $값에 따른 수렴속도

$ \alpha $의 값에 따라 수렴속도를 보여주고 있으며 0일 때 매우 빠르게 수렴하고 있는 것을 볼 수 있다.

 

이 논문을 통해 BT 모델의 수렴속도가 매우 빠른 식에 대해 알 수 있었다.

728x90
728x90
논문링크
https://arxiv.org/pdf/1411.5726.pdf

Introduction


논문이 나온 시점에서 이미지에 설명하는 문제에 대해 이미지를 인간과 같은 방식으로 설명을 생성하는 관심이 생기고 있었다. 그 와 관련하여 Automatic evalution으로 Sentence evalution은 아직 어려운 분야였다. 

논문 이전의 Automatic evalution matric은 Precision 기반의 BLEU와 Recall 기반의 ROUGE가 있었다. 하지만 이러한 Metric은 Human evalution과 Automatic evalution의 Pearson correlation가 낮다고 표시된다. 이후 METEOR가 나오면서, 더 나은 Correlation을 보여주고 있지만 이미지 설명 평가를 할 수 없었다.

이미지 설명에 대해 평가를 할 수 있는 Automatic metric인 Consensus-based Image Desription Evaluation(CIDEr)에 대해 소개한다.

CIDEr의 방식은 다음과 같다.

Generated sentence의 각 n-gram을 Reference sentence에 대해 TF-IDF를 하고 평균을 통해 계산한다.

위와 같은 유사성 산출을 통해 다음 효과를 얻습니다.

  • Grammaticality
  • Correctness/truthfulness

다음 효과를 얻기 때문에 논문에서는 CIDEr을 제안한다.

 

The CIDEr Metric


Metric의 목표는 이미지 $I_i$에 대해 Candidate sentence, $c_i$가 이미지 설명 집합($I$) $S_i = \{s_{i1},..., s_{im}\}$ 에 대해 얼마나 유사한지를 통해 평가한다.

처음에는 Candidate sentence와 Reference sentence를 원래 형태로 매핑합니다("fishes", "fishing", "fished" - →  "fish") . 매핑한 후 1~4의 n-gram을 이용하여 계산합니다.

직관적으로 다음을 만족해야 한다.

Candidate sentence에서 많이 나타나는 n-gram은 적은 정보를 나타낼 수 있기 때문에 이에 대해 낮은 가중치를 주어야 한다. 

이를 위해 각 n-gram에 대해 TF-IDF 가중치 계산을 수행한다.

n-gram인 $\omega_k $에 대해 Candidate sentence인 $s_{ij}$에서 발생하는 횟수를 $h_k(s_{ij})$와 같이 표기하고, Candidate Sentence($c_i$)에 대해 $h_k(c_i)$로 표기한다. 각 n-gram인 $\omega_k$에 대한 TF-IDF 가중치 $g_k(s_{ij})$를 다음과 같이 계산한다.

$$ g_k(s_{ij}) = \frac{h_k(s_{ij})}{\sum_{ω_l \in Ω}h_l(s_{ij})}\text{log}(\frac{|I|}{\sum_{I_p\in I}min(1, \sum_qh_k(s_{pq}))}) $$

다음의 식에 대해 변수를 다시 한번 설명한다.

  • $s_{ij}$ : $s_i$에 대해 $j$번째 Reference Sentence
  • $h_k(s_{ij})$ : 참조 문장 $s_{ij}$에서 n-gram $\mathcal w_k$의 출연 횟수(빈도)
  • $\sum_{ω_l \in Ω}h_l(s_{ij})$ : 모든 문장에서 $I$의 단어의 총합
  • $\sum_{I_p\in I}min(1, \sum_qh_k(s_{pq}))$ : $I_p$에 대해서 해당하는 단어($h_k(s_{pq})$)가 있는지를 계산한다. 있다면 1, 없다면 0을 산출한다.
  • $\Omega$ : 모든 n-gram
  • $I$ : 모든 Sentence

$ g_k(s_{ij}) = \text{TF} \times \text{IDF} $ 와 같다. 첫째 항은 TF($\omega_k$의 빈도), 둘째 항은 IDF($\omega_k$ 의 희소성 )이다.

즉, 적게 나타난 단어에 가중치를 많이 주고 많이 나타난 단어에 가중치를 덜 주면서 $g_k(s_{ij})$를 계산한다.

 

다음은 길이가 n인 n-gram 대해  $\text {CIDEr}_n$ 점수는 Candidate sentence와 Reference sentence의 평균 Cosine similarity를 사용해 계산하며 Precision과 Recall을 모두 고려한다. Precision과 Recall이 고려되는 이유는 Cosine similarity를 이용해 중요한 정보를 얼마나 잘 포착하고 있는지, 그리고 불필요하거나 잘못된 정보를 얼마나 적게 포함하고 있는지를 종합적으로 평가하기 때문이다. 

$$ \text{CIDEr}_n(c_i,S_i) = \frac{1}{m}\sum_j\frac{g^n(c_i)\cdot g^n(s_{ij})}{||g^n(c_i)||||g^n(s_{ij})||} $$

여기서 $g^n(c_i)$는 길이 n의 모든 n-gram에 해당하는 $g_k(c_i)$ 벡터에 의해 형성된 벡터이고 $||g^n(c_i)||$은 벡터 $g^n(c_i)$의 크기다. 마찬가지로 $g^n(s_{ij})$에 대해서도 같다.

 

마지막으로, 우리는 문법적 특성뿐만 아니라 더 풍부한 의미를 포착하기 위해 더 높은 순서(길이가 긴)의 n-gram도 사용한다. 다음과 같이 다양한 길이의 n-gram의 점수를 결합한다:

$$ \text{CIDEr}(c_i,S_i) = \sum^P_{n=1}w_n\text{CIDEr}_n(c_i,S_i) $$

논문에서 균일 가중치 $w_n = \frac{1}{N}$이 가장 잘 작동한다는 것을 발견했으며, $N = 4$ 를 사용한다.

728x90

'Paper > Metric' 카테고리의 다른 글

[Metric Review] BLEU Metric 분석  (0) 2024.03.31
[Metric review] METEOR Metric 분석  (0) 2024.03.29
728x90
논문링크
https://aclanthology.org/P02-1040.pdf

 

Introduction


Machin Translation(MT)에 대해 사람의 평가는 광범위하며 비용이 많이 발생한다. 심지어 사람이 MT의 성능을 파악하는데 몇 달이 걸릴 수 있으며 매우 큰 비용의 노동력을 필요로 한다. 

그래서 저자는 다음과 같은 특징을 가진 automatic machine translation evaluation 방법을 제안한다.

  • Quick
  • Inexpensive
  • Language-independent that correlates highly with human evaluation
  • Little marginal cost per run

 

다음과 같은 특징을 통해 BLEU Metric이 Human Evaluation을 대체하는 Automatic Evaluation이며 대체할 수 있다고 말한다.

BLEU의 핵심 아이디어는 다음과 같습니다.

  • 다양하게 Reference Sentence를 고려
  • 단어 선택과 단어 순서에 대해 "legitimate differences"를 허용

다음과 같은 방식을 통해 Reference 길이 일치에 대해 가중 평균을 사용하는 BLEU Metric을 제안한다.

 

The BLEU Metric


Modified n-gram Precision

Metric의 핵심은 Precision 측정이다. 단순히 Reference translation과 Candidate translation을 유니그램의 출현 횟수로 계산하게 된다면, 일치하는 단어를 중복해서 세는 경우가 발생한다. 그렇게 된다면 비현실적이지만 Example 1에서와 같이 정밀도가 높은 결과를 초래할 수 있다.

Example 1

  • Candidate: the the the the the the the.
  • Reference 1: The cat is on the mat.
  • Reference 2: There is a cat on the mat.

다음과 같은 예시에서 Precision이 매우 높은 결과(7/7)가 나온다. 이러한 문제점으로 인해 Modified $n$-gram precision을 제시한다. Modified $n$-gram precision을 계산하는 방법은 다음과 같다.

Reference translation에서 최대 몇 번 나타나는지 계산한 뒤, 다음으로 각 Cadidate translation의 단어의 총 수를 최대 참조 수로 제한한 후, 제한된 수를 더하고 단어 Reference translation의 총 수로 나눕니다

Example 1에 대한 계산
Unigram Precision : 7/7
Modified Unigram Precision : 2/7

n-gram precision은 multi-sentence test set에 대해서도 계산을 할 수 있다. 수식은 다음과 같다.

계산 방식은 다음과 같다.

  1. 문장별로 n-gram count를 계산한다.
  2. 문장별로 Clipped n-gram count를 계산한다.
  3. 마지막 1번의 값을 2번의 값으로 나눈다.

Example 2

  • Candidate : "the cat sat on the mat. the quick brown fox jumps over the lazy dog. the the the the the the"
  • Reference : "a cat is sitting on the mat. a fast brown fox leaps over a lazy dog. on the mat is a cat" ​
Example 2에 대한 계산

Clipped counts:
"the cat sat on the mat" => 5
"the quick brown fox jumps over the lazy dog" => 7
"the the the the the the" => 2

Unclipped counts:
"the cat sat on the mat" => 6
"the quick brown fox jumps over the lazy dog" => 9
"the the the the the the" => 6


Modified n-gram precision: $ \frac{5+7+2}{6+9+6} ≈ 0.667$

 Modified n-gram precision은 66.7%로 계산되었으며, 이는 후보 문장들이 참조 문장들의 단어 사용 패턴을 66.7%만큼 반영하고 있다는 것을 의미한다.

 

Combining the modified n-gram precisions

다양한 n-gram 크기에 대한 Modified n-gram precision에 대해 각각 1 ~4 - gram에 대해 기하평균을 적용하여 계산을 한다. 그 이유는 n-gram Precision에 대하여 n에 대해 대략 지수적으로 감소하기에 각각에 대해 로그의 가중 평균을 사용한다(로그의 가중 평균은 기하평균을 사용하는 것과 동일).

산술평균과 조화평균을 사용하지 않는 이유는 각각이 일반적인 값이 아니며(산술평균을 사용하지 않는 이유) 각각이 비율이나 속도에 대한 값이 아니기 때문이다.

Sentence length

Candidate Sentence의 길이가 너무 길거나 짧아서는 안되기에 Evaluation Metric이 이를 강제해야 하며 n-gram Precision이 어느 정도 이에 대해 어느 정도 강제하고 있다.  Modified n-gram precision이 어느 정도 Penalty를 주고 있지만, 번역 길이를 강제하는 것에 대해서는 실패한다.  그에 대해서는 다음의 예시를 통해 확인할 수 있다.

Example 3

  • Candidate: of the
  • Reference 1: It is a guide to action that ensures that the military will forever heed Party commands.
  • Reference 2: It is the guiding principle which guarantees the military forces always being under the command of the Party.
  • Reference 3: It is the practical guide for the army always to heed the directions of the party.

수정된 유니그램 정밀도는 2/2이며, 수정된 바이그램 정밀도는 1/1이다.

 

The trouble with recall

Example 3와 같은 길이 문제를 해결하기 위해 Recall을 함께 사용했다. 하지만 BLEU는 Candidate translation에 대해 여러 Reference translation를 고려한다. Candidate translation이 Reference translation 모두 Recall 하는 것은 좋은 번역이 아니다. 다음 예시를 살펴보자

Example 4

  • Candidate 1: I always invariably perpetually do.
  • Candidate 2: I always do.
  • Reference 1: I always do.
  • Reference 2: I invariably do.
  • Reference 3: I perpetually do.

첫 번째 후보는 Reference에서 더 많은 단어를 기억하지만, 두 번째 후보보다 확실히 더 나쁜 번역이다. 따라서, 모든 Reference 에 대해 단순한 Recall은 좋은 측정이 아니다. 참조 번역에 대해 동의어를 발견하고 Recall을 계산하지만 매우 복잡하다.

 

Sentence brevity penalty(BP)

다음과 같이 Recall에 대해 복잡하므로 논문에서는 Sentence brevity penalty를 도입한다. 간단히 말하면, Candidate($c$)의 길이가 Reference($r$)의 길이보다 적다면 Penalty를 준다. 그에 대한 식은 다음과 같다.

식을 정리하면 다음과 같다.  Candidate의 길이가 Reference의 길이보다 적다면 지수적으로 감소를 시킬 것이며, 그렇지 않다면 Penalty를 1로 고정한다.

 

Conclusion


여러 방법을 적용하여 다음과 같은 사항을 고려한다.

  • Sentence brevity penalty(BP) :Candidate translation과 Reference translation의 길이, 단어 선택과 단어 순서에 대해 고려한다.
  • Modified n-gram Precision : 원본 길이를 직접 고려하지 않고, 대신 목표 언어의 참조 번역 길이 범위를 고려한다.

 

정리한 식은 다음과 같다.

 

로그로 바꾸면 더욱 식이 간결하게 다음과 같이 바뀐다.

논문에서의 Baseline은 $N = 4$와 균일 가중치 $w_n = 1/N$을 사용한다.

 

오류사항이 있으면 지적부탁드립니다 :)

728x90

'Paper > Metric' 카테고리의 다른 글

[Metric Review] CIDEr Metric 분석  (0) 2024.04.01
[Metric review] METEOR Metric 분석  (0) 2024.03.29
728x90
논문 링크
https://aclanthology.org/W05-0909.pdf

 

Introduction


 

논문이 써질 시점을 기준으로 Machin Translation(MT) 평가에 대해 Automatic Metric이  상당한 주목을 받게 되었다. 그 이유는 MT System에 대해 Metric을 사용하여 Evalution 하는 것이 두 개 국어를 할 줄 아는 사람이 Evaluation을 하는 것보다  훨씬 바르고 쉽고 저렴하기에 MT Metric에 대해 관심이 높아졌다. 하지만 여러 수식이 MT Evalution Metric이 되는 것은 아니다.  다음은 Metric에 대한 조건이다.

Metric의 조건

  • 인간의 평가와 매우 높은 상관관계를 가져야 함
  • MT 품질에 대해 민감해야 함
  • Consistent (비슷한 Text에 대해 비슷한 Score)
  • Reliable (비슷한 점수에 대해 비슷한 성능)
  • General (다양한 도메인과 시나리오에서 적용 가능 해야 함)

IBM의 BLEU가 다음의 조건을 만족하는  MT Evaluation Metric의 대표적인 예이다. 하지만 BLEU는 여러 가지 단점을 가지고 있다.

Weakness in BLEU

  • The Lack of Recall : BLEU는  정밀도(precision)에 기반을 둔 평가 지표라는 점을 강조하는 것으로, Recall을 직접적으로 다루지 않는다.
  • Use of Higher Order N-gram : BLEU는 문법의 적절성 수준을 간접적으로 측정하기 위해 Higher Order N-gram을 사용
  • Lack of Explicit Word-matching Between Translation and Reference : N-gram 은 명시적인 단어(의미 있는 단어)에 대해 matching을 요구하지 않지만 공통 기능 단어에 대해 잘못된 매칭을 계산하게 됩니다.
  • Use of Geometric Averaging of N-gram : BLEU는 N-gram에 대해 기하평균(1, 2, 3, 4-gram)을 사용하게 된다. 하나가 0이 된다면 BLEU는 전체가 0이 되어서 측정이 될 수 없다. 그래서 n-gram에 대해 동등한 가중치 산술 평균을 사용한 BLEU가 더 나은 상관관계가 있다.

3번째에 대해 간단한 예시이다.

  • 참조 문장: "The cat sat on the mat."
  • 번역된 문장: "A cat was sitting on a mat."

이러한 매칭 방식은 특히 기능 단어들이 포함된 경우, 실제 의미 전달과 문장 구조의 정확성을 완벽하게 반영하지 못할 수 있다. 예를 들어, "on the"와 같은 기능 단어 시퀀스는 많은 문장에서 반복적으로 나타날 수 있으며, 이러한 반복이 의미 전달이나 문법적 정확성과 직접적으로 관련되지 않음에도 불구하고, BLEU 점수에서는 이를 긍정적인 매칭으로 간주할 수 있다.

 

The METEOR Metric


Metric for Evaluation of Translation with Explicit ORdering(METEOR)은 위에서 지적한 BLEU의 약점을 명시적으로 해결하기 위해 설계되었다. Machine Translation과 Reference Translation 사이의 명시적인 단어와 단어의 일치에 기반한 점수를 계산하여 번역을 평가한다. 만약 여러 개의 Reference Translation 주어진 경우는 각 점수를 매기고 최고 점수를 사용한다.

METEOR Metric의 Uni-gram 매핑 과정은 두 가지로 나뉘며, 이 것은 참조 문장과 생성 문장에 대해 최적 정렬을 찾아내는 과정이다.

유니그램 매핑과정

첫 번째 단계는 세 가지 모듈을 사용하여 모든 유니그램이 매핑될 수 있도록 한다.

  • 정확한 모듈: 두 유니그램이 정확하게 일치할 때 이들을 매핑한다. 예를 들어, "computers"는 "computers"에 매핑되지만, "computer"에는 매핑되지 않는다.
  • 포터 어간 모듈: 포터 어간제거기(Porter Stemmer)를 사용해 유니그램을 어간으로 변환한 뒤 같은 어간을 가지는 유니그램끼리 매핑합니다. 예를 들어, "computers"는 어간이 "comput"인 "computers"와 "computer" 모두에 매핑된다.
  • WN 동의어 모듈: 두 유니그램이 서로 동의어일 경우 매핑한다. 이는 단어넷 같은 외부 자원을 활용하여 의미적 유사성을 기반으로 한 매핑이 가능하다.

두 번째 단계는 최적의 유니그램 매핑 부분 집합 선택한다.

$$ (pos(t_i)-pos(t_k))* (pos(r_j)-pos(r_l)) $$

pos($t_x$)는 시스템 번역 문자열에서 유니그램 $t_x$의 숫자 위치를 의미하며, pos($r_y$)는 참조 문자열에서 유니그램 $r_y$의 숫자 위치를 의미한다. 주어진 정렬에 대해, 모든 유니그램 매핑 쌍이 교차하는지 여부를 평가하고, 이 두 번째 단계에서 교차가 가장 적은 정렬이 선택한다.

결론적으로 다시 정리하자면, 매핑쌍이 가장 많은지를 선택한 후 교차가 작은 정렬을 선택하면 그에 대해서 Precision과 Recall을 계산한다.

수식 계산 과정

$$ Fmean = \frac{10PR}{R+9P} $$

다음 수식에 대해 몇 가지를 설명한다.

  1. Recall에 높은 가중치를 준 이유 : BLEU의 Recall에 대해 부족한 Reward를 보완하기 위해 비율을 높게 주었다.
  2. 조화평균을 사용한 이유 : 데이터셋에서 비율의 평균을 다룰 때 조화평균을 사용하기 때문이다.

$$ Penalty=0.5*(\frac{\#chunk}{\#unigrams\_matched})^3 $$

이전 Precision, Recall 그리고 Fmean은 Unigram의 일치에 대해서 계산하며, 더 긴 일치를 고려하기 위해 Penalty를 계산하기 위해서 $chunk$를 사용한다.(여기서 순서에 대해 고려함)

n-gram이 길수록 청크의 수는 줄어들며, 극단적인 경우에서 전체 시스템 번역 문자열이 참조 번역과 일치할 때는 청크가 하나만 있다. 다른 극단적인 경우, 일치가 없다면 유니그램 일치의 수만큼 많은 청크가 있습니다.

예시

  • 시스템 번역 : " the president spoke to the audience"
  • 참조 번역 : " the president then spoke to the audience"

두 개의 번역에 대해 두 개의 청크가 있다. “the president”와 “spoke to the audience”. 

청크의 수가 증가하면 페널티가 증가하여 최대 0.5가 되며, 청크의 수가 1로 감소함에 따라 페널티는 감소한다. 하한은 유니그램의 수에 따라 결정된다. 

산출 과정

단일 시스템 번역에 대해 METEOR는 각 참조 번역에 대해 위의 점수를 계산한 다음, 번역에 대한 점수로 가장 좋은 점수를 계산한다. 시스템에 대한 전체 METEOR 점수는 BLEU에서 수행되는 방식과 유사하게, 전체 테스트 세트에 걸쳐 누적된 집계 통계에 기반하여 계산된다. 

 

728x90

'Paper > Metric' 카테고리의 다른 글

[Metric Review] CIDEr Metric 분석  (0) 2024.04.01
[Metric Review] BLEU Metric 분석  (0) 2024.03.31