CLIP model은 Text로 들어오는 자연어를 Transformer 아키텍처를 사용해서 처리한다. 입력된 Text는 Tokenize되어 Embeding 된 후에 여러 개 층으로 구성된 Transformer 인코더를 통해 처리됩니다. 처리된 자연어는 Vector값으로 반환 되고, 자연어의 의미와 문맥이 어떤 이미지를 의미 하는 지를 512 차원의 Vector 값으로 나타내게 됩니다.
CLIP model process
이제, CLIP을 사용해서 검색에 사용할 자연어를 vector embedding해보자. (이전 포스트에서 이미지를 vector embedding 하던 코드를 조금 변형해서 사용하면 된다.)
from sentence_transformers import SentenceTransformer
from PIL import Image
# 영어 모델 clip-ViT-B-32
# 다국어 모델 clip-ViT-B-32-multilingual-v1
img_model = SentenceTransformer('clip-ViT-B-32-multilingual-v1', device='cpu')
def vectorize(text):
embedding = img_model.encode(text)
return embedding.tolist()
vectorize('빨간 사과')
위 코드를 실행해보면 텍스트가 vector embedding되어 512 차원의 vector를 반환하는 것을 확인 할 수 있다. 반환 받은 vector 값을 이용하여서 이미지 검색을 해보자.
Elasticsearch(이하 ES)에서 자연어나 이미지로 유사한 이미지를 검색하는 방법에 대해서 알아보자.
유사한 이미지를 찾기 위해서는 먼저 이미지들 간의 유사도를 측정할 방법이 필요하고, 유사도를 측정하기 위해서 Vector를 사용할 수 있다. 이미지를 Embedding을 통해서 Vector로 변환하고, Vector 간의 유사도(Cosine similarity)를 계산해서 유사한 이미지를 찾을 수 있다.
그러면, 이미지를 Vector embedding하는 방법은 무엇이 있을까?
이미지를 vector embedding하는 방법과 이를 만들어주는 ML 모델들은 이미 많이 공개 되어 있다. ResNet, VGGNet, Inception 등 많은 모델들이 있다. 모델들의 성능을 잘 비교해서 알맞은 모델을 사용하면 된다.
import pandas as pd
import numpy as np
import sys
from itertools import combinations, groupby
from collections import Counter
from IPython.display import display
# 데이터 파일(객체)이 어느정도 사이즈(MB) 인지 확인 하는 함수.
def size(obj):
return "{0:.2f} MB".format(sys.getsizeof(obj) / (1000 * 1000))
# 파일 저장 경로
path = "./Dataset/Instacart"
Pandas를 이용하여 주문 데이터를 읽어서 데이터의 사이즈와 차원을 확인하고 실제 데이터를 살펴 보기 위해 상위 5개 데이터를 확인해 본다.
주문 데이터는 4개의 차원으로 약 3천만 건의 주문 정보를 담고 있으며, 총 데이터의 크기는 1GB라는 것을 알 수 있다. 4개의 차원은 주문번호, 상품번호, 카트에 담긴 순서, 재(추가)주문 상태를 나타내고 있다. 여기서 연관규칙을 찾을 때 필요한 데이터는 주문번호와 상품번호만 있으면 되기 때문에 주문번호를 인덱스로 하고 상품번호를 Value로하는 Series로 변환한다.
연관규칙을 찾기 위해서는 지지도, 신뢰도, 향상도 지표를 확인하여 규칙의 효용성을 확인 해야 한다. 이 3개 지표를 계산해 내기 위한 함수를 먼저 정의한다.
# 단일 품목이나 품목 집합에 대한 빈도수를 반환한다.
def freq(iterable):
if type(iterable) == pd.core.series.Series:
return iterable.value_counts().rename("freq")
else:
return pd.Series(Counter(iterable)).rename("freq")
# 고유한 주문번호 갯수를 반환한다.
def order_count(order_item):
return len(set(order_item.index))
# 한번에 한 품목 집합을 생성하는 generator를 반환한다.
def get_item_pairs(order_item):
order_item = order_item.reset_index().values
for order_id, order_object in groupby(order_item, lambda x: x[0]):
item_list = [item[1] for item in order_object]
for item_pair in combinations(item_list, 2):
yield item_pair
# 품목에 대한 빈도수와 지지도를 반환한다.
def merge_item_stats(item_pairs, item_stats):
return (item_pairs
.merge(item_stats.rename(columns={'freq': 'freqA', 'support': 'supportA'}), left_on='item_A', right_index=True)
.merge(item_stats.rename(columns={'freq': 'freqB', 'support': 'supportB'}), left_on='item_B', right_index=True))
# 품목 이름을 반환한다.
def merge_item_name(rules, item_name):
columns = ['itemA','itemB','freqAB','supportAB','freqA','supportA','freqB','supportB',
'confidenceAtoB','confidenceBtoA','lift']
rules = (rules
.merge(item_name.rename(columns={'item_name': 'itemA'}), left_on='item_A', right_on='item_id')
.merge(item_name.rename(columns={'item_name': 'itemB'}), left_on='item_B', right_on='item_id'))
return rules[columns]
다음으로, 실제 규칙을 찾기 위해 위 지표를 구하는 함수들을 이용하여, 연관 규칙을 찾는 함수를 정의 한다.
# 미리 준비한 주문 정보(주문번호를 인덱스로 하고 상품번호를 Value로하는 Series)와 최소 지지도를 입력받아 연관 규칙을 반환한다.
def association_rules(order_item, min_support):
print("Starting order_item: {:22d}".format(len(order_item)))
# 빈도수와 지지도를 계산한다.
item_stats = freq(order_item).to_frame("freq")
item_stats['support'] = item_stats['freq'] / order_count(order_item) * 100
# 최소 지지도를 만족하지 못하는 품목은 제외한다.
qualifying_items = item_stats[item_stats['support'] >= min_support].index
order_item = order_item[order_item.isin(qualifying_items)]
print("Items with support >= {}: {:15d}".format(min_support, len(qualifying_items)))
print("Remaining order_item: {:21d}".format(len(order_item)))
# 2개 미만의 주문 정보는 제외한다.
order_size = freq(order_item.index)
qualifying_orders = order_size[order_size >= 2].index
order_item = order_item[order_item.index.isin(qualifying_orders)]
print("Remaining orders with 2+ items: {:11d}".format(len(qualifying_orders)))
print("Remaining order_item: {:21d}".format(len(order_item)))
# 빈도수와 지지도를 다시 계산한다.
item_stats = freq(order_item).to_frame("freq")
item_stats['support'] = item_stats['freq'] / order_count(order_item) * 100
# 품목 집합에 대한 generator를 생성한다.
item_pair_gen = get_item_pairs(order_item)
# 품목 집합의 빈도수와 지지도를 계산한다.
item_pairs = freq(item_pair_gen).to_frame("freqAB")
item_pairs['supportAB'] = item_pairs['freqAB'] / len(qualifying_orders) * 100
print("Item pairs: {:31d}".format(len(item_pairs)))
# 최소 지지도를 만족하지 못하는 품목 집합을 제외한다.
item_pairs = item_pairs[item_pairs['supportAB'] >= min_support]
print("Item pairs with support >= {}: {:10d}\n".format(min_support, len(item_pairs)))
# 계산된 연관 규칙을 계산된 지표들과 함께 테이블로 만든다.
item_pairs = item_pairs.reset_index().rename(columns={'level_0': 'item_A', 'level_1': 'item_B'})
item_pairs = merge_item_stats(item_pairs, item_stats)
item_pairs['confidenceAtoB'] = item_pairs['supportAB'] / item_pairs['supportA']
item_pairs['confidenceBtoA'] = item_pairs['supportAB'] / item_pairs['supportB']
item_pairs['lift'] = item_pairs['supportAB'] / (item_pairs['supportA'] * item_pairs['supportB'])
# 향상도를 내림차순으로 정렬하여 연관 규칙 결과를 반환한다.
return item_pairs.sort_values('lift', ascending=False)
연관 규칙을 찾기 위한 데이터와 프로그램(함수) 준비가 완료 되었다.
연관규칙을 찾아보자.
%%time
rules = association_rules(orders, 0.01)
Starting order_item: 32434489
Items with support >= 0.01: 10906
Remaining order_item: 29843570
Remaining orders with 2+ items: 3013325
Remaining order_item: 29662716
Item pairs: 30622410
Item pairs with support >= 0.01: 48751
Wall time: 6min 24s
출력된 결과를 확인해보자. 약 3천만 건의 주문 정보에서 최소 지지도 0.01를 넘는 약 4만 8천건의 연관 규칙을 찾아 내었고, 연관 규칙을 만들어 내는 데 걸린 시간은 6분 24초가 걸렸다는 것을 알 수 있다.
찾은 결과를 출력해 보자.
# 품목 ID를 보기 좋게 하기 위해서 품목 이름으로 바꿔준다.
item_name = pd.read_csv(path + '/products.csv')
item_name = item_name.rename(columns={'product_id':'item_id', 'product_name':'item_name'})
rules_final = merge_item_name(rules, item_name).sort_values('lift', ascending=False)
display(rules_final)
연관 규칙 결과 테이블
출력된 연관 규칙 테이블을 보면 다소 복잡해 보일 수 있으나, 맨 마지막 열의 향상도(lift)를 보면 품목 간의 관계를 확인 할 수 있다.
lift = 1, 품목간의 관계 없다. *예: 우연히, 같이 사게되는 경우
lift > 1, 품목간의 긍정적인 관계가 있다. *예: 같이 사는 경우
lift < 1, 품목간의 부정적인 관계가 있다. *예: 같이 사지 않는 경우
출력된 향상도를 이용하여 결과를 분석해보자.
먼저, 품목 간의 긍정적인 관계인 향상도가 1 보다 큰 결과를 살펴 보자.
코티지 치즈는 블루베리 아사이 맛과 딸기 치아 맛을 같이 구매한다.
고양이 먹이는 치킨 맛과 칠면조 맛을 같이 구매한다.
요거트는 믹스 베리 맛과 사과 블루베리 맛을 같이 구매한다.
위 결과를 토대로 생각해 보면, 대부분 구입한 한 가지 품목에 대해서 다른 맛을 내는 같은 품목을 같이 구입한다는 것을 알 수 있다.
다음으로, 품목 간의 부정적인 관계인 향상도가 1보다 작은 결과를 보자.
유기농 바나나를 사는 경우 일반 바나나는 사지 않는다.
일반 품종의 아보카도를 구입한 경우 하스 아보카도를 구입하지 않는다.
유기농 딸기를 사는 경우 일반 딸기를 사지 않는다.
이번 결과에서는 구입한 한 가지 품목에 대해서 다른 생산과정 혹은 영양구성의 같은 품목은 같이 구입하지 않는다는 것을 알 수 있다.
이전 포스팅에서 언급했듯이, 단순히 나열된 구매 정보만으로는 확인 할 수 없었던 규칙들을 연관 분석을 통해서 알아 낼 수 있게 되었다. 이러한 정보를 바탕으로 고객들에게 제품을 추천 한다거나 상품의 배열을 바꿔 줄 수 있다면 상품 판매에 의미 있는 결과를 얻을 수 있을 거라 생각한다.
이 노래 가사는 2014년 한국 힙합씬 최대의 이슈 트랙중 하나인 일리네어 레코즈의 연결고리 라는 노래 중 메인 플로우의 한 부분이다.
이 노래의 가사 절반 이상이 저 가사로 가득 차있다. 아마도 연관관계가 없어보이는 너와 나를 이어주는 공감대을 찾고 싶어 했던 것 아니였을까 싶다.
이렇듯, 우리는 언제나 연관관계가 없어보이는 것들 사이에서 접점인 연결고리를 찾고 싶어 한다. 주변 사람들에 대해서도 물론이고 자신이 가지고 있는 물건, 취향들 심지어는 행동까지 연관지어 생각한다.
특히나, 최근에는 디지털 뉴딜이니 데이터 댐이니 하는 이슈로 인해서 데이터에 관심이 집중되고 있고, 이러한 영향으로 자신이 가지고 있는 다양한 데이터 속에서 연관된 규칙을 찾고자하는 사람들이 늘어나고 있다.
게다가 요즘 핫한 AI라는 것이 무의미해 보이는 데이터 속에서 의미 있는 패턴(연관규칙)을 저절로 찾아 준다고 하니, 꼭 한번 해보고 싶을 것이다.
그렇다면, 연관 분석(Association Analysis)이 무엇인지 개념부터 사용법까지 하나씩 알아보자.
경영학에서는 장바구니 분석(Market Basket Analysis)으로 알려진 연관분석은 ‘전체 영역에서 서로 다른 두 아이템 집합이 어떠한 조건과 반응의 형태(if – then)로 발생하는가’ 를 일련의 규칙으로 생성하는 방법(혹은 알고리즘)이다.
예를 들어 ‘아메리카노를 마시는 손님중 10%가 브라우니를 먹는다.’라고 하거나 ‘샌드위치를 먹는 고객의 30%가 탄산수를 함께 마신다.’ 과 같은 식의 결론을 내는 것이다.
이런 규칙성을 많이 사용하는 분야는 대표적으로 판매업이 있다. 고객이 어떤 상품을 고르면 그 상품을 구매한 다른 고객들이 선택한 다른 상품들을 제안해 준다던지 하는 컨텐츠 기반 추천의 기본이 되는 것이다.
그럼 이제, 이러한 연관 분석을 하기 위해 사용되는 데이터부터 살펴보자, 동네 카페 매출이력(transaction)이 다음과 같이 주어졌다고 생각해보자.
거래번호
품목
1154
아메리카노
아이스 카페모카
허니브래드
블루베리 치즈케이크
치즈 케이크
1155
카라멜 마키아또
브라우니
크림치즈 베이글
1156
아메리카노
탄산수
크랜베리 치킨 샌드위치
1157
아메리카노
카라멜 마끼아또
허니 브래드
위 데이터에서 각 고객이 구입한 품목들을 확인 할 수 있는데, 데이터의 연관규칙을 찾기 위해서는 다음과 같이 희소행렬(Sparse Matrix)로 나타내 주면 좋다.
아메리카노
아이스 카페모카
카라멜 마키아또
탄산수
블루베리 치즈 케이크
치즈 케이크
허니 브래드
브라우니
크림 치즈 베이글
크랜베리 치킨 샌드위치
1154
1
1
0
0
1
1
1
0
0
0
1155
0
0
1
0
0
0
0
1
1
0
1156
1
0
0
1
0
0
0
0
0
1
1157
1
0
1
0
0
0
1
0
0
0
이제 연관규칙을 찾을 준비는 되었다. 조건과 반응 형태로 규칙을 만들면 되는데, 다음과 같이 규칙을 만들 수 있다.
아메리카노를 마시는 사람은 아이스 카페모카도 마신다.
아메리카노를 마시는 사람은 치즈케이크도 먹는다.
아메리카노를 마시는 사람은 허니 브래드도 먹는다.
아메리카노를 마시는 ….
“어?! 뭔가 이상하게 생각 했던 것과는 다르다. 뭔가 그럴듯하게 맞아 떨어지는 규칙은 아니네?” 라고 생각 들것이다.
그 생각이 맞다. 이런식으로 규칙을 만든다면, 주어진 데이터에서 무수히 많은 규칙을 만들어 낼 수 있다. 우리는 이 많은 규칙들 가운데서도 좋은 규칙을 찾아 내는 방법을 알아야 한다.
그렇다면, 좋은 규칙은 어떻게 찾을까?
좋은 규칙을 판단하기 위해서 규칙의 효용성을 나타내는 지표는 지지도(Support)와 신뢰도(Confidence) 그리고 향상도(Lift)이다. 이 3가지 지표를 모두 반영해 규칙의 효용성을 판단하고 좋은 규칙을 선택해야 한다.
이 3가지 지표를 구하는 방법은 다음과 같다.
지지도(Support)
전체 거래 중 품목 A와 품목 B를 동시에 포함하는 거래의 비율로 정의한다.
지지도 공식
신뢰도(Confidence)
품목 A를 포함한 거래 중에서 품목 A와 품목 B가 같이 포함될 활률이다. 연관성의 정도를 파악할 수 있다.
신뢰도 공식
향상도(Lift)
A가 구매되지 않았을 때 품목 B의 구매확률에 비해 A가 구매됐을 때 품목 B의 구매활률의 증가 비(Rate)이다. 연관규칙 A -> B는 품목 A와 품목 B의 구매가 서로 관련이 없는 경우에 향상도가 1이 된다.
향상도 공식
이제 좋은 규칙을 고르는 법도 알았으니 실제로 제대로 된 규칙을 찾아 보자.
가능한 모든 경우의 수를 탐색하여 지지도, 신뢰도, 향상도가 높은 규칙을 찾을 수 있다면 가장 이상적일 것이다. 데이터가 작으면 가능할지도 모르겠지만, 데이터가 증가 하면 할수록 계산에 드는 속도도 기하급수적으로 늘어나게 된다.
(알고리즘의 데이터 증가에 대한 복잡도는 n^2이다.)
이러한 이유로 자주 발생하는 아이템에 대해서 빈발 집합(Frequent item sets)을 만들고 이 집합만 고려하는 규칙을 만드는 것이 효율적이다.
예를들어 품목 탄산수의 지지도, 즉 P(탄산수)가 0.1로 나타났다고 보면, 탄산수를 포함한 품목의 지지도는 아무리 높아도 0.1을 넘지 못할 것이다. 탄산수가 단독으로 등장할 확률인 P(탄산수)는 아무리 크게 나와도 P(탄산수, 아메리카노)를 넘지 못 할 것이기 때문이다. 이때 {탄산수, 아메리카노}는 {탄산수}, {아메리카노}의 초월집합(Super set)이라고 한다.
임의의 품목 집합의 지지도가 일정 기준을 넘지 못한다면 해당 집합의 초월 집합의 지지도는 그 기준보다 무조건 더 작을 것이기 때문에 유용한 규칙으로 선택 될 수 없다. 이처럼 최소 지지도 요건을 만족하지 못하는 품목 집합의 규칙을 애당초 제외하면 계산의 효율성을 높일 수 있다.
빈발관계 탐색
그럼 다시 연관 규칙분석을 수행해보자. 최소 지지도 요건을 0.3으로 설정했다고 하자. 그럼 각 품목의 지지도는 아메리카노(0.75), 아이스 카페모카(0.25), 카라멜 마키아또(0.5), 탄산수(0.25), 블루베리 치즈 케이크(0.25), 치즈 케이크(0.25), 허니 브래드(0.5), 브라우니(0.25), 크림 치즈 베이글(0.25), 크랜베리 치킨 샌드위치(0.25)로 나타낼 수 있다.
여기서 최소 지지도를 만족하지 못하는 것들을 제외하여 2개짜리 품목 집합을 생성하면, 다음과 같다.
아메리카노
카라멜 마키아또
허니 브래드
아메리카노
0
0.25
0.5
카라멜 마키아또
0
0.25
허니 브래드
0
여기서도 마찬가지로 품목 {아메리카노, 카라멜 마키아또}와 {카라멜 마키아또, 허니 브래드}는 최소 지지도 0.3을 만족하지 못하였으니 제외 한다. 이런 방식으로 더 이상 최소 지지를 만족하지 못하는 집합이 없을 때까지 품목 집합의 크기를 1씩 증가 시켜가면서 반복 수행 한다.
이러한 방식으로 구한 동네 카페 매출이력 4건을 토대로 가장 좋은(강한) 연관 규칙은 “아메리카노를 마시는 사람은 허니 브래드도 동시에 먹는다.”가 되는 셈이다.
조건절
결과절
지지도
신뢰도
향상도
아메리카노
허니 브래드
0.5
0.67
1.33
여기까지, 연관관계 분석 방법에 대해서 알아보았고, 연관 분석을 통해서 그냥 눈으로만 봐서는 알 수 없었던 거래 데이터에서 규칙을 찾아 낼 수 있었다.
이 외에도 연관 분석 방법은 거래 데이터 뿐만 아니라 순차적이고 반복적으로 발생하는 대부분의 데이터에 적용 할 수 있다.
운영하는 홈페이지에서 어떤 순서로 컨텐츠를 클릭 하였는가?
특정 직무의 사람들은 어떤 순서로 일을 하는가?
특정 문서에 출현한 단어들이 어떤 유의미한 의미로 요약 될 수 있는가?
위의 예 처럼 생각해 볼 수록 많은 응용점들이 있을 거라 생각한다. 한번 자신이 가지고 있는 데이터를 이용하여 각 특성들이 어떤 연결고리가 있는지 분석해 볼 수 있을 것 같다.
갑자기 앞뒤도 없이 “있을 수도 있고 없을 수도 있다.”니 이게 무슨 말인가 싶을 것이다. 이번 글은 양자컴퓨터에 대한 이야기를 다루어 보려고 하는데, 양자컴퓨터의 원리인 양자역학의 불확정성 원리를 쉽게 표현한 말인 것 같아 사용하였다.
사실, 이 말을 들어도 전혀 쉽지않다는 것을 안다. 미국의 천재 물리학자 리처드 파인만은 양자역학에 대해서 “양자역학을 제대로 이해하는 사람은 나를 포함해 아무도 없다”라고 말할 정도로 양자영학은 난해한 주제이다. 하지만 현재 양자역학은 컴퓨터의 주요 부품인 반도체 동작 원리에 사용는 등 점점 우리의 현실세계로 다가 오고 있다. 이런 점에서 전부를 다 알지는 못해도 기술의 발전의 흐름을 이해가기 위해서라도 한번쯤 알아볼 필요가 있다.
Quantum Computing
“우선, 양자컴퓨터를 설명하기에 앞서 기본 원리가 되는 “양자역학”에 대해서 알아보자. “
제일 먼저, 양자역학(Quantum mechanics)이라는 용어 의미를 살펴볼 필요가 있다.
양자역학이란 단어는 양자라는 단어와 역학이라는 단어 2개가 합쳐져서 만들어진 용어이다. 여기서 양자(Quantum)는 양을 의미하는 Quantity에서 온 말로, 어떤 물질이나 에너지양이 띄엄띄엄 떨어져 불연속적으로 존재하는 것을 가리키는 말이다. 역학(Mechanics)은 외력을 받고 있는 물체의 정지 또는 운동상태를 설명하는 학문이다. 간단히 말해 양자역학(Quantum mechanics)은 “불연속적으로 띄엄띄엄 떨어진 물질이나 에너지양이 외력을 받으면 어떤 운동을 하게 되는지 밝히는 학문”이라고 할 수 있다.
이렇게만 말하면 우리가 학창시절 배운 F=ma라는 개념하고 크게 차이가 없어 보인다. 거시적인 관점에서는 이런 이해가 맞다. 하지만 양자 역학은 분자, 원자, 전자, 소립자 등을 다루는 미시적인 세계의 현상을 다룬다는 것이 특징이다.
미시적인 세계에서는 아무리 기이하고 터무니없는 사건이라 해도, 발생 확률이 0이 아닌 이상 반드시 일어난다. 이는 F=ma로는 설명이 안된다.
“아니 잠깐만… 발생 확률이라니 이건 또 무슨말인가?”
F=ma는 뉴턴의 운동 법칙으로 고전물리학의 대표적인 공식이다. 이는 모든 질량(m)을 가진 물체가 가속도(a)를 가지고 움직이면 힘을 계산해 낼 수 있다 것을 의미한다. 즉, 모든 물체는 현재의 운동상태와 힘을 받는 요소에 의해서 예측가능하다는 개념이다.
예를 들어 보자, 축구선수가 골대를 향해 공을 힘껏 찼을때, 골키퍼는 공의 운동방향을 판단해서 날라오는 공을 막으려고 할 것이다.
공의 위치 따른 골키퍼의 위치
이때의 현상을 다시 한번 하나씩 집어 보자. 공이라는 물체에 축구선수가 힘을 가해 가속도를 주었고 공은 주어진 가속도에 의해서 골대까지 날아갈 것이다. 이 공이 골대까지 날아가는 것은 예측할 수 있는 것이고 골키퍼는 예측되는 공의 운동방향으로 몸을 움직여 공을 막을 것이다.
말인 즉슨, 고전 물리학에서 힘을 받는 모든 물체는 예측이 가능했었다. 하지만 19세기 후반부터 미시적 세계에서 예측이 불가능한 모순된 현상이 발견되기 시작했다. 대표적인 예가 빛이다. 빛은 파동이면서 동시에 입자인 특성을 모두 갖는다. 그리고 이러한 특성은 중첩된 상태를 한 번에 확인 할 수 있는 것이 아니라 관측되는 순간 결정 된다. 즉, 관측되기 전에는 빛은 입자이고 하면서 파동이기도 한 상태이다가 관측을 하는 순간 파동 혹은 입자의 형태를 띈다.
이 무슨 말도 안되는 소리인가 싶지만, 이것은 실제 실험을 통해서 밝혀졌다.
“이중슬릿 실험의 관찰자 효과”라는 현상인데, 이중슬릿에 전자를 하나씩 쏘면 파동의 특성인 간섭현상으로 인해서 여러 줄이 나타난다. 하지만 똑같이 실험하는 조건에서 이중슬릿을 지나는 전자가 하나씩 지나가는지 관측자가 확인해 가면서 실험하면 빛은 입자의 특성을 나타내며 2줄만 나타난다.
이중슬릿 실험의 관찰자 효과
바로 이러한 부분이 고전물리학에서 설명하지 못한 모순된 현상이며, 양자역학에서도 현상을 설명 할 뿐 결정 원리에 대해서는 아직도 ‘신이 부리는 요술(God’s trick)’ 이라고 부르는 부분이다.
“아무도 이해하지 못한 이런 것을 어떻게 이용해서 컴퓨터를 만들었다는 것일까?”
양자컴퓨터는 큐비트라는 단위를 사용하는데 이것은 양자의 불확정성 원리를 이용한 것이다. 현재 우리가 사용하고 있는 전통적인 컴퓨터는 정보를 비트(0과 1) 단위로 처리하고 저장한다. 반면, 양자컴퓨터는 정보를 0과 1을 동시에 갖는 큐비트 단위로 처리하고 저장한다.
큐비트(QUBIT)를 표현한 블로흐 구면(Bloch Sphere)
예를 들어 목적지로 가는 N개의 길에서 가장 빠른 길을 찾는다고 가정해 보자.
현재의 비트단위 컴퓨터는 N개의 길을 모두 한번씩 가보고 시간이 가장 적게 걸린 길을 찾을 것이다. 하지만 양자컴퓨터인 경우 N개의 길을 동시에 탐색한다. 가장 빠른 길이 관측되기 전까지 모든 길에 있을 수 있는 중첩된 상태이기 때문이다. 그리고 제일 먼저 목적지에 도착한 상태가 관측이 되면, 그것이 가장 빠른 길로 결정되고 나머지 상태는 사라지는 것이다.
N의 크기가 어떻든 1번만 수행하게 되니 기존의 비트 컴퓨터 보다 정보 처리 능력이 엄청나다고 볼 수 있다. 이런 엄청난 연산력으로 통해서 그 동안 슈퍼 컴퓨터로도 풀지 못했던 수학적 난제를 양자 컴퓨터가 해결해 주고 있다고 한다.
실제로 2013년 구글이 선보인 양자컴퓨터 ‘시커모어’는 현존 최고 성능을 자랑하는 슈퍼컴퓨터로도 1만년이 걸리는 난제를 단 200초(약 3분 20초) 만에 풀어버렸다고 한다. 특히나, 이렇게 빠른 연산력 덕분에 인공지능 분야에서는 시뮬레이션을 기하급수적인 속도로 돌려서 학습시킬 수 있게 되어서 많은 연구가 이루어 지고 있다.
“양자컴퓨터는 현재 어느 수준까지 왔을까?”
양자컴퓨터는 아직 해결해야하는 난제가 많이 남아 있다. 기본 단위인 양자를 충분한 시간동안 유지 하기 위해서는 차폐시설이 중요하다. 양자는 외부 환경 변화에 매우 민감하기 때문에 고도의 방음, 차진 설비를 갖춰야 하고 양자를 이용하기 때문에 기본적으로 영하 273도인 절대온도를 유지해야 하는등 아직 일반인들이 사용하는 수준의 상용화는 아직 넘어야 하는 산들이 많다.
하지만 요즘이 어떤 시대인가? 클라우드 시대 아닌가.
Google, IBM, MS, AWS 등 글로벌 클라우드 회사들이 양자컴퓨터에 대한 연구에 뛰어들어 경쟁을 하고 있다. 그리고 아직은 정식 출시는 아니지만 대부분의 글로벌 클라우드 서비스에는 양자컴퓨팅을 경험해 볼 수 있는 클라우드 서비스들를 출시하고 있다.
MS – Azure Quantum
IBM – Q
AWS – Bra-ket
Google – Zurich
이러한 추세를 생각해 봤을때, 빠른면 3년 길어도 5년이면 양자컴퓨터에 대한 서비스 들이 본격적으로 나올 것으로 생각 된다. 그리고 이러한 변화는 비트 컴퓨터 환경에서 프로그램을 만들던 개발 패러다임에 많은 영향을 줄 것으로 보인다.
2006년에 개봉한 ‘벤 스틸러’ 주연의 ‘영화 박물관이 살아있다.’는 박물관에서 경비일을 맡게 된 주인공이 밤마다 전시된 인형들이 살아 움직이는 것을 보게 되면서 겪게 되는 사건을 담은 코미디 영화이다.
영화에 나오는 것처럼 박물관에 전시되어 있는 인형들이 실제 생명체처럼 지능을 가지고 움직이는 것은 사실 말도 안되는 일이다. 그렇지만 이런 말도 안되는 일들이 이제는 실제로 일어나려고 하고 있다. 그것이 바로 자율 사물이다.
“사물 인터넷을 뛰어 넘어 사물이 자율적인 지능을 갖는다.”
자율 사물(Internet Of Autonomous Things, IoAT)이란, 사물에 인터넷이 연결되어 정보를 수집하고 교환하는 개념의 사물 인터넷(Internet of Things, IoT)에 AI가 탑제되면서 사물이 자율성을 가지고 움직이게 되는 것을 말한다.
Bring AI to device everywhere
사물 인터넷에 대한 사례로는, 최근 몇 년 사이에 새로 만들어지는 가전 제품들을 생각해 볼 수 있다. 냉장고 내부에 카메라와 각종 센서들이 부착되어 내부를 들여다 보지 않아도 냉장고에 무엇이 있고 상태가 어떤지 알 수 있다. 그리고 에어컨이나 보일러의 경우 온도 조절 기능을 스마트폰을 이용하여 원격으로 사용 할 수 있도록 되어 있어서 굳이 제품별 리모콘을 사용하지 않아도 스마트폰 하나로 모두 제어 가능하다.
이제는 대부분의 가전이 스마트폰 하나로 제어가 가능하다고 볼 수 있다. 그리고 이러한 인터넷이 연결된 사물들, 사물 인터넷(IoT)에 AI까지 탑제 되어 자율성까지 갖게 된 것이 자율 사물이다.
앞서 언급한 IoT가 적용된 사례에 AI를 적용해 보자.
냉장고 내부를 들여다 보는 각종 센서들은 보관된 음식들의 상태를 보고 적정 온도로 설정 하고 음식들을 더 오래 신선도를 유지 하도록 스스로 조절한다. 에어컨이나 보일러의 경우 사람이 사용하는 시간이나 사용성을 학습하여 사람이 신경쓰지 않아도 필요한 때에 적절히 동작한다.
“사물이 자율성을 갖고 협업하기 시작했다.”
각각의 사물이 자율성을 갖기 시작하면서, 자율 사물들 간의 협업도 가능해지기 시작했다. 실제로, 2019년 미국 Georgia 대학교에서는 자율 사물들 간의 협업을 이용하여 무인 농업을 연구하고 있다고 발표 했다.
미국 NRI 프로젝트
아직은 연구 단계이긴 하지만 상용화 되어 농업에 적용 된다면, 사람은 더 이상 농사를 짓기 위해 육체적인 노동을 하지 않아도 수확물을 얻을 수 있게 된다.
급격한 AI 기술 발전에 힘입어 사물의 자율성은 계속해서 강화 될 것으로 보이며, 농업 뿐만 아니라 각종 제조, 물류, 건설 등의 산업에 적용 될 것으로 보인다.
“앞으로의 자율 사물의 미래 산업 전망은?”
자율 사물은 2016년부터 가트너의 미래 산업 전망에 사물인터넷과 기계 학습이라는 형태로 소개 되기 시작하다가 2019년부터는 10대 전략 기술 트랜드에 포함되어, 향후 5년 내 자율 사물 시대가 올 것이라고 전망되고 있다.
또한, 글로벌 시장 조사 기관인 MarketsandMarkets에서는 IoT용 AI 시장이 2019년 51억 달러에서, 2024년에는 162억 달러 규모까지 확대 될 것으로 전망하고 있다.
Attractive market opportunities in the AI in IoT market
자율 사물의 핵심 기반은 AI이다. 현재 AI는 인간이 수행하던 많은 업무를 자동화하는 데 기여하고 있다. 하지만 앞으로는 자동화의 수준을 넘어 사물에 탑재되어 동작하는 온디바이스(on-device) 방식으로 진화되어 업무 절차와 판단 기준을 학습함으로써 인간의 개입 없이 동작하는 자율화를 실현해 나갈 것이다.
현재의 AI 기술은 비록 제한된 범위 내에서만 자율적으로 판단, 의사결정을 할 수 있는 수준에 도달하고 있지만, 앞으로 AI 관련 기술의 꾸준한 투자와 연구 개발로 인해서 더 높은 수준의 자율 사물을 확산시킬으로 전망 된다. 이는 많은 산업군의 업무 생태계의 변화를 의미 한다고 생각되며, 앞으로 어떤 새로운 가치를 발견하고, 적응해 나갈 것인가를 고민해 봐야 할 것 같다.
RPA는 Robotic Process Automation의 약자로, 사람이 하는 단순 반복 업무를 로봇을 통해서 자동화하는 것을 의미한다. 여기서 로봇이라 하면, 공장 생산 라인의 실체적 기계가 생각이 들겠지만, RPA는 Software로 구현된 전산업무를 위한 로봇이다.
개념적으로 그리 어려운 것은 아니지만, 최근 몇 년간 엄청나게 가파른 성장을 보여주고 있다. HFS 시장 조사기관에 따르면 RPA 시장 규모는 2016년 약 6억 1,000만 달러를 기록한 이래로 매년 평균 40% 성장하여 2022년에는 약 43억 달러 규모로 성장할 것으로 보여진다.
RPA Service and Software Market 2016-2022
“무엇 때문에 이렇게 성장하는 것 일까?“
그 동안 적용이 어려웠던 일선 업무 환경까지 자동화가 확장 된 것이 크다고 볼 수 있다. 일선 업무 환경(Front Office)은 사람이 판단해야 하는 경우가 많아 정형화가 어렵기 때문에 자동화를 적용하기엔 많은 어려움이 있었다. 대부분 일선 업무들의 자동화라는 것들은 지원 업무(Back Office)를 통해서 처리 결과를 받아 처리하는 형태로 업무가 이루어 지고 있었다.
예를들어, 인바운드 고객 서비스를 처리 한다고 해보자. 고객 서비스 관리 채널을 통해 고객 서비스 내용을 접수한 담당자는 서비스를 요청한 고객에 대한 정보를 내부에서 관리하는 고객 관계 관리(CRM: Customer Relationship Management) 시스템에서 조회/확인할 것이다. 그리고 확인된 고객정보를 기준으로 서비스 내용을 해결하고 최종 처리 결과에 대해서 고객에게 전달하고 같은 내용을 내부 서비스 관리 시스템에 등록할 것이다.
위 예시에서 언급된 CRM 시스템은 일선 업무에서 수작업으로 관리하던 고객 정보를 지원 업무를 통해 관리 정보를 정형화 하고 프로세스 체계를 만들어 고객정보 관리를 자동화 시킨 시스템이다.
즉, RPA 이전의 자동화라는 것은 일선 업무에서 필요한 내용을 지원 업무로부터 자동화 서비스 형태로 제공 받은 것을 말한다. 하지만 RPA가 등장한 이후에는 일선 업무 담당자가 자신이 하는 일에 대한 일련의 과정을 프로세스로 정의만 할 수 있으면 지원 업무를 통하지 않고도 많은 부분 자동화 할 수 있게 되었다.
다시 고객 서비스 예시로 돌아가 RPA를 적용해 보자. 일선 업무 담당자가 고객 서비스를 접수하면 그 순간 자동으로 RPA 로봇이 관련 고객 정보를 수집하여 보여 줄 것이다. 고객 서비스를 하는 데 있어서 선제적으로 고객 정보를 파악할 수 있게 되는 것이다. 그리고 고객 서비스 응대 완료 후 고객에게 답변을 보내면 RPA 로봇이 같은 내용을 내부 서비스 관리 시스템에 자동으로 등록해 줄 것이다. 같은 내용을 여러 시스템에 등록하던 업무를 1회만 하게 되어 업무 효율을 높일 수가 있게 된다.
마치 RPA 로봇과 협업을 하여 업무를 처리 한다고 생각할 수 있다.
일선 업무 담당자가 수작업으로 하던 기간계 업무를 RPA 로봇과 협업하여 생산성을 높일 수 있게 된 것이다. 이러한 이유로 대부분의 산업 분야로부터 지대한 관심을 받게 되었고, 그것이 엄청나게 가파른 성장으로 이어진 것이다.
“RPA를 충분히 잘 활용하려면 어떤것들이 준비 되어 있어야 할까? “
도입 초반에는 사람의 판단이 필요없는 단순 반복적인 작업이나, 간단한 조회성 잡무들에 적용을 하게 된다. 가장 가까운 예로 내부 관리 시스템(ERP, Groupware 등)에 로그인을 하거나 받은 메일함에서 특정 메일 데이터를 정리하는 것들이 있다. 이러한 것들만 대체되어도 업무를 수행 하는 데 있어서 많은 도움이 된다. 하지만 시간이 갈 수록, 이러한 부분은 한사람이 처리할 수 있는 일의 양을 늘렸을 뿐, 근본적으로 전체적인 업무를 자동화 하진 못하는 한계가 나타난다.
RPA 도입이 충분한 효과를 내기 위해서는 자신의 하고 있는 일련의 업무를 전체적으로 이해하고 자동화 하기 위한 단위 프로세스를 도출해 내는 능력을 키워야 한다. 그리고 도출된 단위 프로세스들을 지속적으로 자동화 컨텐츠로 준비 해두어야만 RPA를 잘 활용할 수 있게 된다.
“앞으로는 AI와 RPA 결합을 통해 초자동화 시대가 될 것이다.”
현재는 사람의 직관으로 판단해야 하는 부분으로 인해서 모든 업무의 과정을 자동화 프로세스로 만들어 내기 어렵다. 하지만 RPA에 AI가 결합 된다면 사람의 개입을 최소화할 수 있고, 업무 효율을 최대로 끌어 올릴 수 있다.
사람과 로봇이 협업하는 초자동화 시대
이전 포스팅에서 다뤘던 자연어 처리에 대한 내용과 연관지어 생각해 보면, 사람의 말을 알아 듣는 챗봇과 사람이 하던 업무들을 자동으로 처리하는 RPA 로봇의 조합을 생각해 볼 수 있다. 그리고 이러한 생각은 수 년 내에 우리의 일상에서 접할 수 있을 것이라 본다. 로봇과 일상적인 언어(자연어)로 대화하고 자동으로 처리된 결과물을 받아보는, 사람과 로봇이 협업하는 초자동화 시대가 올 것이라고 감히 생각해본다.