Spaces:
Sleeping
Sleeping
Oskar van der Wal
commited on
Commit
·
97a1414
1
Parent(s):
6e551eb
First initial commit
Browse files- README.md +6 -7
- app.py +148 -0
- contrastive_pair.md +1 -0
- description.md +9 -0
- notice.md +8 -0
- simple_translation.md +5 -0
README.md
CHANGED
|
@@ -1,13 +1,12 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
-
sdk_version: 3.
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
-
license: mit
|
| 11 |
---
|
| 12 |
|
| 13 |
-
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Bias in MT
|
| 3 |
+
emoji: 🌍
|
| 4 |
+
colorFrom: yellow
|
| 5 |
+
colorTo: indigo
|
| 6 |
sdk: gradio
|
| 7 |
+
sdk_version: 3.3
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
|
|
|
| 10 |
---
|
| 11 |
|
| 12 |
+
A demo showing how gender bias could manifest in MT models when translating from Hungarian to English.
|
app.py
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio
|
| 2 |
+
import inseq
|
| 3 |
+
from inseq.data.aggregator import AggregatorPipeline, SubwordAggregator, SequenceAttributionAggregator, PairAggregator
|
| 4 |
+
import torch
|
| 5 |
+
|
| 6 |
+
if torch.cuda.is_available():
|
| 7 |
+
DEVICE = "cuda"
|
| 8 |
+
else:
|
| 9 |
+
DEVICE = "cpu"
|
| 10 |
+
|
| 11 |
+
def swap_pronoun(sentence):
|
| 12 |
+
if "He" in sentence:
|
| 13 |
+
return sentence.replace("He", "She")
|
| 14 |
+
elif "She" in sentence:
|
| 15 |
+
return sentence.replace("She", "He")
|
| 16 |
+
else:
|
| 17 |
+
return sentence
|
| 18 |
+
|
| 19 |
+
def run_counterfactual(occupation):
|
| 20 |
+
occupation = occupation.split(" (")[0]
|
| 21 |
+
|
| 22 |
+
model_name = f"Helsinki-NLP/opus-mt-hu-en"
|
| 23 |
+
|
| 24 |
+
# "egy" means something like "a", but is used less frequently than in English.
|
| 25 |
+
#source = f"Ő egy {occupation}."
|
| 26 |
+
source = f"Ő {occupation}."
|
| 27 |
+
|
| 28 |
+
model = inseq.load_model(model_name, "integrated_gradients")
|
| 29 |
+
model.device = DEVICE
|
| 30 |
+
target = model.generate(source)[0]
|
| 31 |
+
#target_modified = swap_pronoun(target)
|
| 32 |
+
|
| 33 |
+
out = model.attribute(
|
| 34 |
+
[
|
| 35 |
+
source,
|
| 36 |
+
source,
|
| 37 |
+
],
|
| 38 |
+
[
|
| 39 |
+
#target,
|
| 40 |
+
#target_modified,
|
| 41 |
+
target.replace("She", "He"),
|
| 42 |
+
target.replace("He", "She"),
|
| 43 |
+
],
|
| 44 |
+
n_steps=150,
|
| 45 |
+
return_convergence_delta=False,
|
| 46 |
+
attribute_target=False,
|
| 47 |
+
step_scores=["probability"],
|
| 48 |
+
internal_batch_size=100,
|
| 49 |
+
include_eos_baseline=False,
|
| 50 |
+
device=DEVICE,
|
| 51 |
+
)
|
| 52 |
+
#out = model.attribute(source, attribute_target=False, n_steps=150, device=DEVICE, return_convergence_delta=False, step_scores=["probability"])
|
| 53 |
+
|
| 54 |
+
squeezesum = AggregatorPipeline([SubwordAggregator, SequenceAttributionAggregator])
|
| 55 |
+
masculine = out.sequence_attributions[0].aggregate(aggregator=squeezesum)
|
| 56 |
+
feminine = out.sequence_attributions[1].aggregate(aggregator=squeezesum)
|
| 57 |
+
|
| 58 |
+
return masculine.show(aggregator=PairAggregator, paired_attr=feminine, return_html=True, display=True)
|
| 59 |
+
#return out.show(return_html=True, display=True)
|
| 60 |
+
|
| 61 |
+
def run_simple(occupation, lang, aggregate):
|
| 62 |
+
occupation = occupation.split(" (")[0]
|
| 63 |
+
|
| 64 |
+
model_name = f"Helsinki-NLP/opus-mt-hu-{lang}"
|
| 65 |
+
|
| 66 |
+
# "egy" means something like "a", but is used less frequently than in English.
|
| 67 |
+
#source = f"Ő egy {occupation}."
|
| 68 |
+
source = f"Ő {occupation}."
|
| 69 |
+
|
| 70 |
+
model = inseq.load_model(model_name, "integrated_gradients")
|
| 71 |
+
out = model.attribute([source], attribute_target=True, n_steps=150, device=DEVICE, return_convergence_delta=False)
|
| 72 |
+
|
| 73 |
+
if aggregate:
|
| 74 |
+
squeezesum = AggregatorPipeline([SubwordAggregator, SequenceAttributionAggregator])
|
| 75 |
+
return out.show(return_html=True, display=True, aggregator=squeezesum)
|
| 76 |
+
else:
|
| 77 |
+
return out.show(return_html=True, display=True)
|
| 78 |
+
|
| 79 |
+
with open("description.md") as fh:
|
| 80 |
+
desc = fh.read()
|
| 81 |
+
|
| 82 |
+
with open("simple_translation.md") as fh:
|
| 83 |
+
simple_translation = fh.read()
|
| 84 |
+
|
| 85 |
+
with open("contrastive_pair.md") as fh:
|
| 86 |
+
contrastive_pair = fh.read()
|
| 87 |
+
|
| 88 |
+
with open("notice.md") as fh:
|
| 89 |
+
notice = fh.read()
|
| 90 |
+
|
| 91 |
+
OCCUPATIONS = [
|
| 92 |
+
"nő (woman)",
|
| 93 |
+
"férfi (man)",
|
| 94 |
+
"nővér (nurse)",
|
| 95 |
+
"tudós (scientist)",
|
| 96 |
+
"mérnök (engineer)",
|
| 97 |
+
"pék (baker)",
|
| 98 |
+
"tanár (teacher)",
|
| 99 |
+
"esküvőszervező (wedding organizer)",
|
| 100 |
+
"vezérigazgató (CEO)",
|
| 101 |
+
]
|
| 102 |
+
|
| 103 |
+
LANGS = [
|
| 104 |
+
"en",
|
| 105 |
+
"fr",
|
| 106 |
+
"de",
|
| 107 |
+
]
|
| 108 |
+
|
| 109 |
+
with gradio.Blocks(title="Gender Bias in MT: Hungarian to English") as iface:
|
| 110 |
+
gradio.Markdown(desc)
|
| 111 |
+
|
| 112 |
+
print(simple_translation)
|
| 113 |
+
with gradio.Accordion("Simple translation", open=True):
|
| 114 |
+
gradio.Markdown(simple_translation)
|
| 115 |
+
|
| 116 |
+
with gradio.Accordion("Contrastive pair", open=False):
|
| 117 |
+
gradio.Markdown(contrastive_pair)
|
| 118 |
+
|
| 119 |
+
gradio.Markdown("**Does the model seem to rely on gender stereotypes in its translations?**")
|
| 120 |
+
|
| 121 |
+
with gradio.Tab("Simple translation"):
|
| 122 |
+
with gradio.Row(equal_height=True):
|
| 123 |
+
with gradio.Column(scale=4):
|
| 124 |
+
occupation_sel = gradio.Dropdown(label="Occupation", choices=OCCUPATIONS, value=OCCUPATIONS[0])
|
| 125 |
+
with gradio.Column(scale=4):
|
| 126 |
+
target_lang = gradio.Dropdown(label="Target Language", choices=LANGS, value=LANGS[0])
|
| 127 |
+
aggregate_subwords = gradio.Radio(
|
| 128 |
+
["yes", "no"], label="Aggregate subwords?", value="yes"
|
| 129 |
+
)
|
| 130 |
+
but = gradio.Button("Translate & Attribute")
|
| 131 |
+
out = gradio.HTML()
|
| 132 |
+
args = [occupation_sel, target_lang, aggregate_subwords]
|
| 133 |
+
but.click(run_simple, inputs=args, outputs=out)
|
| 134 |
+
|
| 135 |
+
with gradio.Tab("Contrastive pair"):
|
| 136 |
+
with gradio.Row(equal_height=True):
|
| 137 |
+
with gradio.Column(scale=4):
|
| 138 |
+
occupation_sel = gradio.Dropdown(label="Occupation", choices=OCCUPATIONS, value=OCCUPATIONS[0])
|
| 139 |
+
but = gradio.Button("Translate & Attribute")
|
| 140 |
+
out = gradio.HTML()
|
| 141 |
+
args = [occupation_sel]
|
| 142 |
+
but.click(run_counterfactual, inputs=args, outputs=out)
|
| 143 |
+
|
| 144 |
+
with gradio.Accordion("Notes & References", open=False):
|
| 145 |
+
gradio.Markdown(notice)
|
| 146 |
+
|
| 147 |
+
|
| 148 |
+
iface.launch()
|
contrastive_pair.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
This example is very similar to the **Simple translation** example, but now we ask how the model's behaviour would change if we change the translation of “ő” from “he” to “she”? The `probability` row at the bottom shows the difference in the probability between both versions of the translation.
|
description.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Gender Bias in MT: Hungarian to English
|
| 2 |
+
|
| 3 |
+
The Hungarian language has no grammatical gender and words like “he” and “she” are both translated as “ő”.
|
| 4 |
+
This makes it an interesting language to study gender bias in machine translation (MT) models, when translating to another language that does distinguish between “he” and “she”.
|
| 5 |
+
In this demo, we will test the OPUS-MT models (Tiedemann & Thottingal, 2020) from the *Language Technology Research Group at the University of Helsinki* ([Helsinki-NLP](https://github.com/Helsinki-NLP)).
|
| 6 |
+
|
| 7 |
+
For each translation, we also use the [Inseq library](https://github.com/inseq-team/inseq) to compute the feature attributions with integrated gradients: How important is each token in the source (Hungarian) for the translation of the target tokens (English)?
|
| 8 |
+
|
| 9 |
+
⚠️ Please note that this demo is just an illustration of how gender bias could manifest in MT models, but an actual assessment of its bias requires a more rigourous experiment.
|
notice.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
The idea for testing the gender bias in translations from Hungarian to English comes from Farkas and Németh (2022).
|
| 2 |
+
|
| 3 |
+
### References:
|
| 4 |
+
[Inseq: Intepretability for Sequence Generation Models 🔍](https://github.com/inseq-team/inseq). GitHub.
|
| 5 |
+
|
| 6 |
+
Tiedemann, J., & Thottingal, S. (2020). [OPUS-MT — Building open translation services for the World](https://helda.helsinki.fi/handle/10138/327852). Proceedings of the 22nd Annual Conferenec of the European Association for Machine Translation (EAMT).
|
| 7 |
+
|
| 8 |
+
Farkas, A., & Németh, R. (2022). [How to measure gender bias in machine translation: Real-world oriented machine translators, multiple reference points](https://www.sciencedirect.com/science/article/pii/S2590291121001352). Social Sciences & Humanities Open, 5(1), 100239.
|
simple_translation.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Select an occupation (or the word “woman”/“man”) from the dropdown menu and press `Translate & Attribute` to translate a sentence like “He/She is a nurse” from Hungarian:
|
| 2 |
+
|
| 3 |
+
> Ő nővér.
|
| 4 |
+
|
| 5 |
+
Which pronouns (“she”/“he”) do the MT models go for? Does it change depending on the occupation term you choose? And can we find a difference between the target languages (you can change it in the other dropdown menu on the right)?
|