Python 26

itertools: iterator를 위한 도구 모음

iterator? iterable? itertools는 iterator를 잘 다루기 위한 기능들을 모아둔 모듈입니다. iterator에 대한 설명은 Iterator, Generator 라는 글을 참조하시면 좋습니다. 왜 iterator가 필요한지, 어떻게 쓰는지, generator와 관계는 무엇인지가 설명되어 있습니다. iterator를 언제 쓰는지 간단히 요약해 보면 다음과 같습니다. element 수가 너무 많아서 한 번에 메모리에 올릴 수 없다. 또는 element 수가 몇 개인지 미리 알 수 없다. element 하나하나를 만드는데 시간이 오래 걸리거나 리소스를 많이 쓴다. 그래서 필요할 때 만들어 쓰고 싶다. 특정 index의 element를 꺼내올 수 없거나 매우 어렵다. 하지만 다음 elem..

Python 2023.02.19

if __name__ == '__main__': 이 뭔가요?

파이썬 코드들을 보다보면 아래와 같은 코드를 종종 볼 수 있습니다. if __name__ == '__main__': # something here 이 코드가 하는 일은 무엇일까요? 오늘은 이 코드의 작동 원리와 언제 사용하는지 알아보겠습니다. __name__ 은 무엇일까요? 먼저 첫번째 퍼즐 조각인 __name__이 무엇인지부터 알아보겠습니다. Python에는 미리 정의된 특수한 함수나 변수들이 있습니다. 함수는 __do()__ 같은 형태이고, 변수는 __val__ 같은 형태입니다. 이런 특수한 함수와 변수는 보통 Python 내부적으로 사용하기 위한 것들이라서 코딩 때 직접 사용할 일은 그다지 많지 않습니다. 그런데 __name__은 아주 유용한 특성이 있어서 일반 코딩 때도 곧잘 사용되곤 합니다. 좋..

Python 2023.01.15

Python GIL(Global Interpreter Lock)이 무엇일까요?

오늘은 Python을 좋아하지 않는 분들이 자주 Python(정확히는 CPython)을 공격하는 이유 중 하나인 GIL에 대해서 이야기해보려고 합니다. GIL을 이해하기 위해서는 먼저 thread, process와 같은 병렬처리에 대한 기본적인 이해가 필요합니다. 이번 포스트에서는 thread와 process가 무엇인지는 알고 계신다고 가정하고 이야기를 진행해 보겠습니다. ※ GIL은 CPython 만이 가지는 특징입니다. Jython, IronPython, PyPy 같은 다른 Python 구현은 GIL을 사용하지 않습니다. GIL이 풀려고 하는 문제는 무엇일까? 먼저 GIL이 풀려고 하는 문제부터 살펴보겠습니다. GIL이 풀려고 하는 것은 Multi-thread 프로그래밍에서 아주 골치 아픈 문제인 r..

Python 2023.01.13

Python Callable

callable은 무엇이지? Python에서 callable은 함수를 호출하듯이 호출할 수 있는 객체를 의미합니다. 프로그래밍 언어 용어에 대한 설명답게 뭔가 미묘하면서 깔끔하지 않은 느낌이 드는 문장이죠? "함수를 호출하듯이 호출한다"는 부분이 눈에 걸리지 않을까 합니다. 일반적인 프로그래밍 언어에서는 호출할 수 있는 것은 함수(또는 메소드) 뿐이기 때문입니다. 변수 a를 호출하세요. 클래스 Cat을 호출하세요. 이상하죠? 그럼 Python에는 함수 외에도 호출할 수 있는 무언가가 있다는 뜻일까요? 짧은 답은 "그렇다"입니다. 긴 답은 아래에서 차근차근 이야기해보겠습니다. callable() 함수 먼저 Python이 built-in으로 제공하는 callable() 함수를 살펴보겠습니다. callable..

Python 2022.07.11

Transformer로 한국어 품사 태거 만들기

한국어 품사 태거를 만들어 봅시다 품사 태거(Part-of-Speech Tagger)는 NLP에서 기본이 되는 태스크이고, 그 때문에 NLP를 배울 때 많이 만들어보는 기능이기도 합니다. 품사 태거가 NLP에서 나름 인기있는 이유는 몇가지가 있을 겁니다. 다른 NLP Task의 입력 또는 전처리 역할을 합니다. 요즘은 트렌드가 언어학적인 요소를 많이 배제하는 추세지만 전통적으로 파싱, 번역 등의 NLP 파이프라인에 많이 쓰였습니다. 한국어에서 BPE와 같은 통계적인 Tokenizer를 대신하는 방법으로 쓰이기도 합니다. 한국어의 특성상 통계적인 Subword보다는 형태소 단위를 토근으로 쓸 때 성능이 더 좋긴 경우들이 있습니다. (참조: 한국어 토큰의 단위는 뭐가 좋을까?) 품사 태깅은 Sequentia..

Deep Learning 2021.06.13

Pytorch로 훈련 이어서하기 (checkpoint)

모델을 훈련시키는데 오랜 시간이 걸리다보면 여러가지 이유로 처음에 생각했던 Epoch만큼 훈련을 시키지 못하고 중간에 끝나는 경우가 있습니다. 누군가 실수로 Ctrl+C를 눌러버린다거나, 모종의 이유로 훈련 프로세스가 죽어버린다거나, 아니면 GPU를 다른 곳에 쓰기 위해서 눈물을 머금고 중간에 멈추는 경우도 있습니다. 이럴 때 유용한 방법이 중간 중간 모델을 저장해두고 나중에 그 시점부터 훈련을 이어서 하는 것입니다. 오늘은 중간중간 모델을 저장하는 방법과 나중에 이어서 훈련을 시작하는 방법을 알아보겠습니다. import torch import torch.nn as nn import torch.optim as optim import argparse class MyModel(nn.Module): def _..

Deep Learning 2021.06.09

한국어 띄어쓰기: 실전 예제로 배워보는 딥러닝 자연어 처리

한국어 띄어쓰기: 실전 예제로 배워보는 딥러닝 자연어 처리 아름다운별지구에오신여러분을환영합니다 딥러닝도 좀 배웠고, 자연어처리도 좀 배웠고, pytorch도 좀 배웠는데 막상 뭔가를 만들어 보려면 막막할 수 있습니다. 오늘은 pytorch를 이용해서 한국어 띄어쓰기 모듈을 바닥부터 만들어보고, 이 과정에서 실제로 어떻게 간단하 자연어처리기를 개발하는지 살펴보려고 합니다. "아름다운별지구에오신여러분을환영합니다"를 입력으로 주면 "아름다운 별 지구에 오신 여러분을 환영합니다"로 바꿔주는 것이 오늘의 목표입니다. 딥러닝과 Pytorch에 대해서 기본적인 부분을 습득하고 있다고 가정하겠습니다. 특히 Pytorch에 대한 사용법은 설명하지 않으니 참고 부탁드립니다. 문제 정의, 발상의 전환 머신러닝 문제를 풀 때..

Deep Learning 2021.05.26

Iterator, Generator

문제 두가지 아주 아주 큰 list 0부터 99,999,999까지 숫자의 제곱을 출력하는 코드를 살펴보겠습니다 for i in [i ** 2 for i in range(100000000)]: print(i) 첫번째 결과인 0의 제곱이 출력될 때까지 얼마나 걸릴까요? 제 컴퓨터에서는 약 27초가 걸렸습니다. 그냥 0의 제곱을 출력할 뿐인데 왜 이렇게 오래 걸릴까요? 문제는 바로 [i ** 2 for i in range(100000000)] 부분에 있습니다. 이 코드는 List Comprehension이기 때문에 for loop를 돌기 전에 0부터 99,999,999까지 모든 수의 제곱을 먼저 계산합니다. 그리고 만들어진 list를 대상으로 for loop가 돕니다. 하지만 우리가 하고 싶은 것은 순차적으로..

Python 2021.05.08

List Comprehension

시작하기 전에 list comprehension은 기능을 배우는 것보다 이름을 이해하는 것이 더 어렵습니다. list comprehension이라는 용어에 대한 설명은 관심있는 분들을 위해서 이 글의 마지막에 남겨두겠습니다. 소개 list comprehension이 하는 일은 이미 있는 list를 가지고 무엇인가 작업을 해서 새로운 List를 만드는 것입니다. 간단한 예를 하나 보겠습니다. [1, 2, 3, 4]의 각 값을 제곱해서 [1, 4, 9, 16]을 만들고 싶다고 가정해보겠습니다. result = [] for i in [1, 2, 3, 4]: result.append(i ** 2) print(result) [1, 4, 9, 16]아주 직관적인 코드입니다. Functional Programming..

Python 2021.05.04

Jupyter Lab

소개 파이썬은 장점이 참 많은 언어입니다. 깔끔한 문법, 수많은 라이브러리, 다양한 실행 환경 등 말이죠. 파이썬의 수많은 장점 중에서 빼놓을 수 없는 것이 바로 인터렉티브한 개발 환경이라고 생각합니다. C/C++나 Java 같은 언어만 사용하다가 파이썬을 접하게되면 언어 자체 뿐만 아니라 인터렉티브한 개발 환경에 감탄을 하게 됩니다. 아주 기본적인 REPL(Read-Eval-Print Loop)를 제공하는 기본 파이썬 명령만 하더라도 이미 훌륭하지만, 여기에서 iPython으로 넘어간다면 그야말로 신세계를 경험할 수 있습니다. 이렇게 뛰어난 파이썬의 개발 환경 속에서도 요즘 가장 돋이는 것은 Jupyter Lab이라고 할 수 있습니다. Jupyter Lab을 사용하면 IDE를 따로 설치하지 않고도 웹 ..

Python 2021.05.01