Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- venv
- package.json
- path.data
- node.js
- airflow
- 7.7.1
- typescript
- kibana
- Crontab
- KoA
- elasticsearch
- framework
- devtools
- grok
- elastic
- windows
- CSV
- json
- Tutorial
- configure
- ubuntu
- OPCUA
- query
- ELK
- filebeat
- PYTHON
- DSL
- Data Engineering
- dense_vector
- logstash
Archives
- Today
- Total
Gibbs Kim's playground
[ElasticStack-25] dotProduct and sigmoid in elasticsearch 본문
Tech 기록지/Elastic Stack
[ElasticStack-25] dotProduct and sigmoid in elasticsearch
Lio Grande 2020. 7. 1. 14:00엘라스틱서치는 벡터값들에 대한 내적 곱연산 (dotProduct)를 지원한다.
공식문서에서 제공하는 예제는 다음과 같다
### curl -X GET "localhost:9200/my_index/_search?pretty" -H 'Content-Type: application/json' -d'
GET my_index/_search ### on Kibana DevTools
{
"query": {
"script_score": {
"query" : {
"bool" : {
"filter" : {
"term" : {
"status" : "published"
}
}
}
},
"script": { """
"source": "double value = dotProduct(params.query_vector, 'my_dense_vector');
return sigmoid(1, Math.E, -value);
""",
"params": {
"query_vector": [4, 3.4, -0.2]
}
}
}
}
}
예제를 기반으로 my_vector와 query_vector를 다음과 같이 설정해서 테스트해보았다.
### my_vector
my_vector = [1.0678,-0.6043,3.5467,2.1635]
### query_vector
query_vector = [4, 3.4, -0.2, 4]
#### result of return ( sigmoid(1, Math.E, -value) )
max_score : 0.9999614
sigmoid()는 ES에서 제공하는 내부 함수인데, 연산의 결과를 ES에서 출력하기 좋게 변환하는 기능으로 이해하고 있다. 예를 들어, dotProduct를 수행하면 결과 값이 음수가 나오는 경우가 있는데 이때, scoring에 이슈가 발생할 수도 있다. 이러한 이슈를 막아주기 위해 제공하는 기능이 sigmoid()와 같은 함수다.
sigmoid의 표현법은 위의 예제대로지만, 실제로 연산되는 식은 다음과 같다.
### Sigmoid
sigmoid(value, k, a) = value^a/ (k^a + value^a)
위의 예제를 기반으로 연산되는 식을 작성해보면 다음과 같이 작성할 수 있다.
sigmoid(1, Math.E, -value) = 1^(-value)/ (Math.E^(-value) + 1^(-value)))
여기서 value는 my_vector와 query_vector의 dotProduct 값이다.
### value = dotProduct(my_vector, query_vector)
my_vector = [1.0678,-0.6043,3.5467,2.1635]
query_vector = [4, 3.4, -0.2, 4]
value = (my_vector[0]*query_vector[0]) + (my_vector[1]*query_vector[1]) + (my_vector[2]*query_vector[2]) + (my_vector[3]*query_vector[3])
value = 10.16124
sigmoid 연산식에 대입해보자
sigmoid=1^(-10.16124)/ (Math.E^(-10.16124) + 1^(-10.16124))
Math.E는 ES에서 특정한 값(링크기준 항목 E( ))으로 치환된다.
(참고: https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-functions-math.html)
E() ## same as Math.E
=> 2.718281828459045
연산결과는 다음과 같다.
sigmoid = 0.9999614
위의 max_score와 결과가 같음을 확인할 수 있고, 관련된 식들의 연산이 잘 수행되었음을 확인할 수 있다.
'Tech 기록지 > Elastic Stack' 카테고리의 다른 글
[ElasticStack-27] Elasticsearch msearch (with Python) (0) | 2020.07.23 |
---|---|
[ElasticStack-26] ES data directory move (0) | 2020.07.10 |
[ElasticStack-24] elasticsearch & logstash template (shard setting) (0) | 2020.07.01 |
[ElasticStack-23] curl -XGET ES connection (0) | 2020.06.30 |
[ElasticStack-22] Vector data indexing via Logstash & Elasticsearch (0) | 2020.06.29 |